解释为什么Javascript中的匿名函数可以访问外部函数中的变量?
在我开始之前,我意识到ECMA脚本规范可能会回答我的问题,但我这样问是希望得到一个可理解的答案 以下面的代码为例:解释为什么Javascript中的匿名函数可以访问外部函数中的变量?,javascript,settimeout,Javascript,Settimeout,在我开始之前,我意识到ECMA脚本规范可能会回答我的问题,但我这样问是希望得到一个可理解的答案 以下面的代码为例: function test1(param) { alert(param); } function test2() { var testvar = 99; setTimeout(function(){ test1(testvar); }, 1000); } test2(); 如果我运行这个代码,我会得到一个弹出框,显示99。 我的问题是,在test2中,
function test1(param) {
alert(param);
}
function test2() {
var testvar = 99;
setTimeout(function(){ test1(testvar); }, 1000);
}
test2();
如果我运行这个代码,我会得到一个弹出框,显示99。
我的问题是,在test2中,testvar在test2完成运行后不应该为null吗?setTimeout中的匿名函数如何获取testvar的值?调用setTimeout时是否有某种堆栈复制正在进行?该功能被调用。你基本上是对的,如果在匿名函数中需要,周围作用域中的变量会被保存。该功能被调用。对于发生的情况,您基本上是正确的,如果匿名函数中需要,则会保存周围作用域中的变量。这是由于。本质上,函数定义时可用的变量始终可用,无论从何处调用。这是由于。本质上,函数定义时可用的变量始终可用,无论从何处调用。这是函数定义的结果。JavaScript中的函数保留对词法范围中定义的-close-over-variables的引用。也就是说,在创建给定给setTimeout的函数时可以引用的所有变量都可以在test2返回后很长时间内被引用
这样,闭包既是一个函数,也是创建函数时作用域中变量的一组绑定。这就是为什么有时会调用闭包,反之亦然。这是函数的结果。JavaScript中的函数保留对词法范围中定义的-close-over-variables的引用。也就是说,在创建给定给setTimeout的函数时可以引用的所有变量都可以在test2返回后很长时间内被引用
这样,闭包既是一个函数,也是创建函数时作用域中变量的一组绑定。这就是为什么有时叫闭包,反之亦然。去拿瓶伏特加,读一下这个问题。我想给你一个答案,但我的办公室有禁止饮酒的规定。令人惊叹的谢谢你的帮助。去拿瓶伏特加,读一下这个问题。我想给你一个答案,但我的办公室有禁止饮酒的规定。令人惊叹的谢谢你的帮助,谢谢!我不知道这个有个名字。你会认为,在我四年的计算机科学本科学习中,他们至少会提到这一点。谢谢!我不知道这个有个名字。你可能会认为,在我四年的计算机科学本科学习中,他们至少会提到这一点。