2

我对编程很陌生,并且有一个关于此处给出的关闭演示的快速问题:http: //youtu.be/hQVTIJBZook?t= 27m19s

代码是:

var digit_name = function () {
    var names = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];
    return function (n) {
        return names[n];
    };
} ();

alert(digit_name(3));

我的问题是:为什么();在函数之外还有一个额外的功能digit_name?我们是在调用匿名辅助函数吗?我在没有 的情况下运行它();,它返回了" function (n) {return names[n];} ". 当您将参数 3 传递给函数 digit_name 时,我非常感谢您描述参数 3 会发生什么,因为该函数没有指定的参数。

如果我问的是基本问题或使用了不正确的术语,我深表歉意。我已经研究了一些相关的问题,但唉,无济于事!在此先感谢那些能够提供时尚答案的人。

4

1 回答 1

2

在该代码中,它使外部函数立即执行,从而将内部函数返回为digit_name. 但是由于返回的函数带有对 的引用names,因此外部函数的作用域不会像正常情况下那样终止。因此,范围存在并且它变成了一个闭包。

就像这样做:

function anon() {
  var names = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];
  return function (n) {
    return names[n];
  };
}

var digit_name = anon();

alert(digit_name(3));

因此,当您调用时digit_name(),您实际上是在调用返回的内部函数,该内部函数带有它自己的names.

我建议你在 MDN阅读有关闭包的信息。我还有一篇文章简单地讨论了闭包。

于 2013-06-09T04:26:16.310 回答