首页 > 关于js中eval的作用域的问题

关于js中eval的作用域的问题

如何给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在间接调用时,就不遵守JavaScript词法环境的规则了。

你的代码实质上是用了eval的间接调用方式,而又想让它访问当前作用域中的变量,是不可能的。所以你必须改变代码的写法。

参考:10.4.2 Entering Eval Code

【热门文章】
【热门文章】