【问题标题】:Explain why anonymous functions in Javascript can access variables in the outer function?解释为什么Javascript中的匿名函数可以访问外部函数中的变量?
【发布时间】:2012-02-25 13:24:35
【问题描述】:

在我开始之前,我意识到 ECMA 脚本规范可能会回答我的问题,但我在 SO 上询问它是为了希望得到一个可以理解的答案。

取以下代码:

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

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

test2();

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

【问题讨论】:

标签: javascript settimeout


【解决方案1】:

这是 closures 的结果。 JavaScript 中的函数保留对在其词法范围内定义的变量的引用——“关闭”。也就是说,在创建给setTimeout 的函数时可以引用的所有变量都可以在test2 返回后很久才能引用。

这样,闭包既是一个函数,又是一组与创建函数时范围内的变量的绑定。这就是为什么有时将闭包称为poor man's objects反之亦然)。

【讨论】:

  • 谢谢!我不知道这实际上有一个名字。你会认为,在我作为计算机科学本科生的 4 年里,他们最少会提到这一点。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-31
      • 2012-05-26
      • 2020-08-19
      • 2014-03-11
      • 2013-08-16
      • 2012-01-14
      相关资源
      最近更新 更多