在开始之前,我意识到ECMA脚本规范可能会回答我的问题,但我在SO上提出这个问题希望得到一个可理解的答案。
请使用以下代码:
function test1(param) {
alert(param);
}
function test2() {
var testvar = 99;
setTimeout(function(){ test1(testvar); }, 1000);
}
test2();
如果我运行此代码,我会弹出一个显示99的弹出框。
我的问题是,test2
在testvar
完成后,test2
不应该为空? setTimeout
中的匿名函数如何获得testvar
的值?当setTimeout被调用时,是否存在某种堆栈复制?
答案 0 :(得分:3)
这是 closures 的结果。 JavaScript中的函数保留对其引用的引用 - “close over” - 在其词法范围中定义的变量。也就是说,创建赋予setTimeout
的函数时可以引用的所有变量都可以在test2
返回后很长时间被引用。
通过这种方式,闭包既是函数,也是创建函数时范围内变量的一组绑定。这就是为什么闭包有时被称为poor man's objects(而反之亦然)。
答案 1 :(得分:1)
这是由Javascript Closures引起的。从本质上讲,函数在定义时可用的变量将始终可用,无论它在何处被调用。
答案 2 :(得分:0)
该功能称为closures。你对发生的事情基本上是正确的,如果在匿名函数中需要它们,那么来自周围范围的变量就会被保存。