运行 另一个函数范围内的代码 (JavaScript)

running code in another function's scope (JavaScript)

所以我正在研究一种 JavaScript 框架,只是我自己在未来项目中使用的一些实用工具,我想制作一个数据绑定系统。

我使用的第一个方法是对象,代码将循环遍历指定的 html 元素并在标记中查找 {{key}} 的出现,然后在对象中查找该键并在 HTML.

中以这种方式替换它

例如,如果您在 HTML 中有 <div>{{name}} is a cool guy</div>,在 JS 中有 {name:"joseph"},那么最终产品将在屏幕上显示为 'joseph is a cool guy'。

然而,我后来决定改变我的方法,而不是框架将排除一个函数。所以你应该给它 function(){ var name = "joseph" }.

而不是 {name:"joseph"}

这显然看起来更好并且提供了更好的功能。

我更改了处理函数,所以不是寻找 key/value 对来替换 {{key}},它只是对变量使用 eval 来获取它的值。


我的问题在于:我如何 运行 我的 search/replace 代码在用户传递的函数范围内。

如果用户在该函数内定义变量,则由于作用域问题,它们的值将无法在其他任何地方使用。

我试过使用 Function.toString() 实际修改函数的源代码,但没有任何效果,而且非常复杂。 (问题不是由于实际的解决方案,我认为 Function.toString() 可能有效,但由于我的实施。我不断收到错误)

那么... 运行 另一个函数范围内的任意代码的最佳方法是什么?

标准:

  1. 显然,我无法修改函数,因为用户正在传入它。(你不能只告诉我将 search/replace 代码添加到函数底部)
  2. 变量必须在函数的局部范围内。 (没有使用 window.name = "joseph" 或任何东西作弊)

我也知道 eval 有多么糟糕,因此非常感谢任何有关让它工作的建议。谢谢!


代码:

function process(html) {
        var vars = html.match( /({{)[^{}]*(}})/g )
        // vars = ['{{variable}}', '{{anotherVariable}}']
        var names = vars.map( function(x){ return x.replace("{{", "").replace("}}", "") } )
        // names = ['variable', 'anotherVariable]

        obj = {}

        for (var i = 0; i < names.length; i++) {
            obj[names[i]] = eval(names[i])
        }

        for (var p in obj) {
            html = html.replace(new RegExp('{{'+p+'}}','g'), obj[p]);
        }

        return html
}

你应该回到你使用对象的第一个方法,它好多了。你仍然可以传递一个函数,但是函数应该 return 一个对象:

function () {
    return { name: 'joseph' }
}