解释为什么Javascript中的匿名函数可以访问外部函数中的变量?

时间:2012-02-02 21:04:23

标签: javascript settimeout

在开始之前,我意识到ECMA脚本规范可能会回答我的问题,但我在SO上提出这个问题希望得到一个可理解的答案。

请使用以下代码:

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

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

test2();

如果我运行此代码,我会弹出一个显示99的弹出框。 我的问题是,test2testvar完成后,test2不应该为空? setTimeout中的匿名函数如何获得testvar的值?当setTimeout被调用时,是否存在某种堆栈复制?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

这是由Javascript Closures引起的。从本质上讲,函数在定义时可用的变量将始终可用,无论它在何处被调用。

答案 2 :(得分:0)

该功能称为closures。你对发生的事情基本上是正确的,如果在匿名函数中需要它们,那么来自周围范围的变量就会被保存。

相关问题