函数返回需要被称为闭包

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

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

防爆

function a() {
    var i = 10;
    function b() {
       alert(i);
    }
}

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

return function b(){alert(i);}

返回函数不会改变,重要的是创建它并调用它。 这就使得闭包,即从内部函数到创建它的范围的链接(你可以在实践中将它看作是一个指针,例如,它可以防止外部范围的外化) 。


闭包只是一种保持其词汇环境的功能,在它自身死亡之前不会放过它。

把封闭想象成Scrooge叔叔:

在这里输入图像描述

叔叔斯克罗吉是个吝啬鬼。 他永远不会放过他的钱。

同样封闭也是一个吝啬鬼。 它不会放弃它的变量,直到它自己死亡。

例如:

function getCounter() {
    var count = 0;

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

var counter = getCounter();

看到那个功能counter ? 由getCounter函数返回的那个? 这个功能是一个吝啬鬼。 即使count变量属于getCounter函数调用并且该函数调用已结束,它也不会放开count变量。 因此我们呼吁counter封闭。

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

然而,当getCounter的调用结束时, counter函数(可以访问count变量)不允许它死掉。 这是因为counter功能需要count 。 因此,只会让count死它死自己了。

现在要注意的真正有趣的事情是, countergetCounter的调用中。 因此,即使counter应该死在getCounter的调用结束时 - 但它不会。 它生活在即使在调用getCounter结束,因为它逃脱的范围(寿命) getCounter

counter可以通过多种方式避开getCounter的范围。 getCounter最简单的方法就是返回counter 。 但是还有更多的方法。 例如:

var counter;

function setCounter() {
    var count = 0;

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

setCounter();

在这里, getCounter的姐妹函数(恰当地称为setCounter )为全局counter变量分配一个新的counter函数。 因此,内部counter函数setCounter的范围转义为闭包。

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

有关更多信息,请阅读此答案:https://stackoverflow.com/a/12931785/783743


根据闭包的定义,从函数到包含范围的链接就足够了。 所以基本上创建函数使其成为闭包,因为这是链接在JavaScript中创建的地方:-)

然而,为了利用这个特性,我们确实从不同于其定义的范围调用函数 - 这就是实践中所指的“使用闭包”这个术语。 这既可以是一个较低的范围,也可以是一个较高的范围 - 并且函数不一定需要从定义它的函数中return

一些例子:

var x = null;

function a() {
    var i = "from a";
    function b() {
        alert(i); // reference to variable from a's scope
    }
    function c() {
        var i = "c";
        // use from lower scope
        b(); // "from a" - not "c"
    }
    c();

    // export by argument passing
    [0].forEach(b); // "from a";
    // export by assigning to variable in higher scope
    x = b;
    // export by returning
    return b;
}
var y = a();
x(); // "from a"
y(); // "from a"
链接地址: http://www.djcxy.com/p/52031.html

上一篇: Is a function return necessary to be called a Closure

下一篇: setTimeout with Loop in JavaScript