函数返回需要被称为闭包
嘿,我在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
死它死自己了。
现在要注意的真正有趣的事情是, counter
在getCounter
的调用中。 因此,即使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