JavaScript的动态属性是“eval”改变了调用上下文。这是什么意思?一些例子会更好。
答案 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)
“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