JavaScript中的eval如何更改调用上下文?

时间:2012-01-01 17:03:30

标签: javascript

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

3 个答案:

答案 0 :(得分:4)

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?”

答案 1 :(得分:3)

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

答案 2 :(得分:0)

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

在这里解释它似乎没有多大意义,因为有很多在线文章处理这个和好的JS书籍,如Javascript,好的部分也处理它。

以下是Google中排名靠前的链接:http://ajax.sys-con.com/node/676031