如何给eval设置正确的作用域?
我想让eval
能够取得当前函数中的变量。
function test(){
var left = {}
te('left.top=456') //报错left undefined
return left
}
function te(str){
eval(str)
}
var a = test();
注意:eval
必须要在另一个函数上,就是不能在test()
中直接写eval
可以试试new Function
,
new Function("left","left.top=123")(left);
这个问题关键在于 js作用域是词法作用域, 不是动态作用域 也就是调用te的环境里的var left = {}
是不能被识别到的...
相反定义te的环境的left才能识别, 本问题定义te在全局作用域.
这样就可以了
var left = {}
function test(){
te('left.top=456')
return left
}
function te(str){
eval(str)
}
var a = test();
如果你不想有全局的变量left
可以考虑这样
function test(){
var left = {}
function te(str){
eval(str)
}
te('left.top=456')
return left
}
var a = test();
做不到。
eval
在JavaScript中有两种调用方式:直接调用和间接调用。
直接调用时:eval内代码块的作用域绑定到当前作用域。
间接调用时:eval内代码块的作用域绑定到全局作用域。
换句话说,eval在间接调用时,就不遵守JavaScript词法环境的规则了。
你的代码实质上是用了eval的间接调用方式,而又想让它访问当前作用域中的变量,是不可能的。所以你必须改变代码的写法。
参考:10.4.2 Entering Eval Code