javascript - 关于js中eval的作用域的问题
PHP中文网
PHP中文网 2017-04-11 11:21:20
[JavaScript讨论组]

如何给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

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(3)
巴扎黑

做不到。

eval在JavaScript中有两种调用方式:直接调用间接调用

  • 直接调用时:eval内代码块的作用域绑定到当前作用域。

  • 间接调用时:eval内代码块的作用域绑定到全局作用域。

换句话说,eval在间接调用时,就不遵守JavaScript词法环境的规则了。

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

参考:10.4.2 Entering Eval Code

黄舟

这个问题关键在于 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();
天蓬老师

可以试试new Function

new Function("left","left.top=123")(left);
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号