是否需要将函数返回称为闭包

Nav*_*Nav 5 javascript closures

嘿,我在youtube上看到了这个视频http://www.youtube.com/watch?v=KRm-h6vcpxs

这基本上解释了IIFE和闭包.但我不明白的是我是否需要返回一个函数才能将其称为闭包.

防爆

function a() {
    var i = 10;
    function b() {
       alert(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我可以将其称为闭包,因为它从外部函数的作用域访问'i'变量或者我是否需要返回这样的函数

return function b(){alert(i);}
Run Code Online (Sandbox Code Playgroud)

Aad*_*hah 9

闭包只是一个保留其词法环境的函数,并且在其自身消亡之前不会释放它。

将闭包想象为史高治叔叔:

在此输入图像描述

史克鲁奇叔叔是个守财奴。他永远不会放弃他的钱。

同样,闭包也是一个守财奴。它不会释放它的变量,直到它自己消亡。

例如:

function getCounter() {
    var count = 0;

    return function counter() {
        return ++count;
    };
}

var counter = getCounter();
Run Code Online (Sandbox Code Playgroud)

看到那个功能了counter吗?函数返回的那个getCounter?该功能是一个守财奴。count即使该变量count属于该getCounter函数调用并且该函数调用已结束,它也不会释放该变量。因此我们称之为counter闭包。

查看每个函数调用都可能创建变量。例如,对getCounter函数的调用会创建一个变量count。现在这个变量count通常会在getCounter函数结束时消失。

然而,counter函数(可以访问count变量)不允许它在调用getCounter结束时终止。这是因为该counter功能需要count. 因此,只有在它自己死了之后,它才允许它count死。

现在要注意的真正有趣的事情是它counter是在对 的调用中诞生的getCountercounter因此,当调用结束时,甚至应该死亡getCounter- 但事实并非如此。即使在调用结束后它仍然存在,getCounter因为它逃逸了 的范围(生命周期)getCounter

有很多方法counter可以逃避 的范围getCounter。最常见的方法是getCounter简单地 return counter。然而还有很多方法。例如:

var counter;

function setCounter() {
    var count = 0;

    counter = function counter() {
        return ++count;
    };
}

setCounter();
Run Code Online (Sandbox Code Playgroud)

这里 的姊妹函数getCounter(恰当地称为setCounter)将一个新counter函数分配给全局counter变量。因此,内部函数逃逸了成为闭包counter的范围。setCounter

实际上在 JavaScript 中每个函数都是一个闭包。然而,直到我们处理脱离父函数作用域的函数并且即使在父函数调用结束后仍然保留属于父函数的某些变量时,我们才意识到这一点。

有关更多信息,请阅读此答案:/sf/answers/905224981/

  • +1 使帖子更有趣的图片。可怜的人们——滚蛋吧!:) (3认同)

Den*_*ret 4

返回函数不会改变任何东西,重要的是创建它并调用它。这使得闭包成为从内部函数到创建它的作用域的链接(实际上,您可以将其视为指针。例如,它具有防止外部作用域产生垃圾的相同效果) 。