6

想在这里得到一些直接的东西......所以我有 2 个问题

下面的函数创建一个闭包。

function Foo(message){
    var msg = message;

    return function Bar(){ 
        this.talk = function(){alert(msg); }
    }
};

问:哪个函数是闭包,Foo还是Bar
我一直认为闭包是Foo,因为它关闭了Bar一次Bar返回。

下一个...

下面是匿名函数的定义:

()();

问:这个匿名函数中的内部函数也是闭包吗?

(function(){ /* <-- Is this function also a closure? */ })();
4

2 回答 2

4

您需要在这里使用第一原则。Javascript 使用词法范围。这意味着执行上下文的范围取决于代码的定义方式(词法)。

我会说函数的定义Bar导致创建闭包的原因,因为msg在函数中是“封闭的”。

闭包的实际创建发生在运行时(这有点像重言式的陈述,因为计算机程序在运行之前不会发生任何事情),因为为了确定msg, in的值Bar,当Bar执行时,解释器需要知道Foo执行时变量的值,依此类推。

对于你的问题,我将给出两个答案。迂腐的答案是:这两个函数本身都不是闭包。它是函数中变量的定义,结合函数运行时的执行上下文,定义了闭包。常见的答案是:关闭变量的任何函数都是闭包(在您的情况下为 Bar )。

考虑每个人在使用 Javascript 时遇到的问题。

function A(x) {
   var y = x, fs = [];

   for (var i = 0; i < 3; i++) {
       fs.push(function(){
         console.log (i + " " + x);
       })
   }

   fs.forEach(function(g){g()})  
}

A('hi')

大多数人会说这会产生输出“hi 1”,然后是“hi 2”,然后是“hi 3”。但是,它会产生 3 次“hi 3”。如果只是将函数的定义添加到数组中,而使用外部函数中定义的变量,则创建了闭包,这怎么可能?

这是因为您需要执行上下文来定义闭包,直到运行时才会发生。在执行数组中的函数时,i值为3。在forEach语句中,这就是执行上下文,这就是输出总是使用 3 的原因。

于 2012-08-20T14:30:56.880 回答
1

Bar是关闭。

我们说它Bar 关闭了其环境中的变量msg

大多数情况下,闭包这个词的意思是:在一个封闭函数中使用至少一个在封闭范围内定义的变量的函数。

回答你的第二个问题:(function(){ ... })()它看起来像:一个匿名函数,而不是两个。除非它嵌套在另一个函数中,否则通常不会将其称为闭包。但是,嵌套在该匿名函数中的函数可以是闭包(并且通常是)。

于 2012-08-20T14:49:53.113 回答