【发布时间】:2012-01-01 17:03:30
【问题描述】:
JavaScript 的动态属性是“eval”改变调用上下文。这是什么意思?一些例子会更好。
【问题讨论】:
-
请添加您阅读上述声明的来源。
-
eval作用于调用上下文。一些代码见this。这意味着调用eval的上下文是正在评估的代码将在其中执行的上下文。
标签: javascript
JavaScript 的动态属性是“eval”改变调用上下文。这是什么意思?一些例子会更好。
【问题讨论】:
eval 作用于调用上下文。一些代码见this。这意味着调用eval 的上下文是正在评估的代码将在其中执行的上下文。
标签: javascript
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 调用不会更改上下文(也不会更改范围)。
【讨论】:
“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
【讨论】:
我假设您的意思是执行上下文,而不是调用上下文。
在这里解释似乎没有多大意义,因为网上有很多关于这个的文章和好的 JS 书籍,如 Javascript,The Good Parts 也有。
这是一个在 Google 中名列前茅的链接:http://ajax.sys-con.com/node/676031
【讨论】: