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

解释为什么Javascript中的匿名函数可以访问外部函数中的变量?,javascript,settimeout,Javascript,Settimeout,在我开始之前,我意识到ECMA脚本规范可能会回答我的问题,但我这样问是希望得到一个可理解的答案 以下面的代码为例: function test1(param) { alert(param); } function test2() { var testvar = 99; setTimeout(function(){ test1(testvar); }, 1000); } test2(); 如果我运行这个代码,我会得到一个弹出框,显示99。 我的问题是,在test2中,

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

以下面的代码为例:

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返回后很长时间内被引用


这样,闭包既是一个函数,也是创建函数时作用域中变量的一组绑定。这就是为什么有时叫闭包,反之亦然。

去拿瓶伏特加,读一下这个问题。我想给你一个答案,但我的办公室有禁止饮酒的规定。令人惊叹的谢谢你的帮助。去拿瓶伏特加,读一下这个问题。我想给你一个答案,但我的办公室有禁止饮酒的规定。令人惊叹的谢谢你的帮助,谢谢!我不知道这个有个名字。你会认为,在我四年的计算机科学本科学习中,他们至少会提到这一点。谢谢!我不知道这个有个名字。你可能会认为,在我四年的计算机科学本科学习中,他们至少会提到这一点。