2012-01-01 40 views
3

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

+5

请在阅读上述声明的位置添加源代码。 – Starx 2012-01-01 17:07:03

+0

'eval'作用域到调用上下文。有关代码,请参阅[this](http://www.bennadel.com/blog/1926-Exploring-Javascript-s-eval-Capabilities-And-Closure-Scoping.htm)。这意味着调用“eval”的上下文是被执行代码的执行环境。 – 2012-01-01 17:08:43

+0

http://www.langnetsymposium.com/2009/talks/18-LarsBak-JavaScript.html – dalibocai 2012-01-01 18:06:25

回答

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

3

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

“一”的变量是上下文的一部分,和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 
+0

您的调用定义上下文与我的理解有很大不同,这是一系列函数调用。我会等待一些更清晰的答案。 – dalibocai 2012-01-01 18:13:41

+0

调用上下文意味着所有的变量都可以从调用的作用域访问:“this”,局部变量,闭包捕获变量,全局变量。 – clyfe 2012-01-01 18:42:27

+0

我明白了。为你+1。 – dalibocai 2012-01-01 18:53:50

0

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

下面是其中居于首位在谷歌的链接:http://ajax.sys-con.com/node/676031

+0

链接的文字无法阅读,巨大的广告涵盖了所有页面。 – katspaugh 2012-01-01 17:27:20

+0

@katspaugh,而不是在我的浏览器上,但无论如何,也许打印版本效果更好:http://ajax.sys-con.com/node/676031/print – Lucero 2012-01-01 17:34:23

+0

天哪,他们有一个更小的广告,即使在打印版。不过,这好多了。谢谢! – katspaugh 2012-01-01 17:35:46