2012-02-02 20 views
2

在我开始之前,我意识到ECMA脚本规范可能会回答我的问题,但我希望能够回答这个问题。解释为什么Javascript中的匿名函数可以访问外部函数中的变量?

看看下面的代码:

function test1(param) { 
    alert(param); 
} 

function test2() { 
    var testvar = 99; 
    setTimeout(function(){ test1(testvar); }, 1000); 
} 

test2(); 

如果我运行此代码,我得到展示99 我的问题是,在test2,不应testvartest2完成后运行为null一个弹出框? setTimeout中的匿名函数如何得到testvar的值? setTimeout被调用时是否有某种堆栈复制正在进行?

+0

提示:Google“关闭”。 – cHao 2012-02-02 21:07:44

+0

去抢一瓶伏特加,并阅读这个问题。我会尽力给你一个答案,但我的办公室没有酒精政策。 http://stackoverflow.com/questions/500431/javascript-variable-scope – aehiilrs 2012-02-02 21:10:21

+0

太棒了。谢谢您的帮助。 – quuxbazer 2012-02-02 21:22:38

回答

3

这是closures的结果。 JavaScript中的函数保留对“close over”的引用 - 在其词汇范围中定义的变量。也就是说,创建setTimeout函数时可以引用的所有变量都可以在test2返回后很长时间引用。

通过这种方式,闭包既是一个函数,也是一组绑定到创建函数时在范围内的变量的绑定。这就是为什么封闭有时被称为poor man's objects(和反之亦然)。

+1

谢谢!我不知道这里有一个名字。你会认为在我作为一名计算机科学大学四年后,他们至少会提到这一点。 – quuxbazer 2012-02-02 21:22:06

0

该功能被称为closures。对于发生的情况,你基本上是正确的,如果需要匿名函数,周围范围的变量将被保存。

1

这发生是由于Javascript Closures。本质上,函数在定义时可用的变量始终可用,无论函数来自何处。

相关问题