运行 另一个函数范围内的代码 (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()
可能有效,但由于我的实施。我不断收到错误)
那么... 运行 另一个函数范围内的任意代码的最佳方法是什么?
标准:
- 显然,我无法修改函数,因为用户正在传入它。(你不能只告诉我将 search/replace 代码添加到函数底部)
- 变量必须在函数的局部范围内。 (没有使用
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' }
}
所以我正在研究一种 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()
可能有效,但由于我的实施。我不断收到错误)
那么... 运行 另一个函数范围内的任意代码的最佳方法是什么?
标准:
- 显然,我无法修改函数,因为用户正在传入它。(你不能只告诉我将 search/replace 代码添加到函数底部)
- 变量必须在函数的局部范围内。 (没有使用
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' }
}