【问题标题】:How eval in JavaScript changes the calling context?JavaScript 中的 eval 如何改变调用上下文?
【发布时间】:2012-01-01 17:03:30
【问题描述】:

JavaScript 的动态属性是“eval”改变调用上下文。这是什么意思?一些例子会更好。

【问题讨论】:

标签: javascript


【解决方案1】:

eval 在间接调用时确实会改变上下文。并将其更改为全局上下文(所有函数的默认上下文)。

var myObj = { a: 1 }

function someFunc() {
    console.log(eval('this.a')) // 1
    console.log(eval('this === myObj')) // true

    var indirectEval = eval

    console.log(indirectEval('this.a')) // undefined
    console.log(indirectEval('this === window')) // true
}

void someFunc.call(myObj)

直接eval 调用不会更改上下文(也不会更改范围)。

详情请见“Global eval. What are the options?”

【讨论】:

    【解决方案2】:

    http://jsfiddle.net/9h6n7/1/

    “a”变量是上下文的一部分,而 eval 会改变它。
    调用上下文是围绕 eval 调用的变量,在我们的例子中只是“a”变量,而“this”在浏览器中等于窗口。

    var a = 1;
    eval("a = 2;");
    alert(a); // 2
    

    一个更清楚的例子http://jsfiddle.net/9h6n7/2/

    function executeEval(){
      eval("a = 2;");
    }
    
    var a = 1;
    executeEval();
    alert(a); // 2
    

    【讨论】:

    • 你对调用上下文的定义和我的理解有很大不同,是函数调用的序列。我会等待更清晰的答案。
    • 调用上下文是指可以从调用范围内访问的所有变量:“this”、局部变量、闭包捕获变量、全局变量。
    【解决方案3】:

    我假设您的意思是执行上下文,而不是调用上下文。

    在这里解释似乎没有多大意义,因为网上有很多关于这个的文章和好的 JS 书籍,如 Javascript,The Good Parts 也有。

    这是一个在 Google 中名列前茅的链接:http://ajax.sys-con.com/node/676031

    【讨论】:

    • 链接的文字无法阅读,一个巨大的广告覆盖了整个页面。
    • @katspaugh,不在我的浏览器上,但无论如何,打印版本可能效果更好:ajax.sys-con.com/node/676031/print
    • 天哪,他们甚至在印刷版中也有一个较小的广告。不过,这要好得多。谢谢!
    • 我当然同意你的观点,我可以用谷歌搜索得到很多信息。但问题是我需要“挖掘”它才能找到对我真正有价值的作品。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 2015-07-30
    • 2020-06-14
    • 2010-12-04
    • 2012-11-09
    相关资源
    最近更新 更多