和我读过的文章一样,我还有一些问题。
我已经知道(并理解)关闭的用法,如:
臭名昭着的循环问题(每个人都保持号码的警报链接循环)
增加了计数器(继续调用函数 - >警告增加的数字)
来自here:
内部函数引用其外部函数的局部变量 创建闭包
来自here:
一个闭包是一个函数的局部变量 - 在之后保持活着 函数已返回,或者闭包是否为堆栈框架 函数返回时释放。 (好像是'堆叠框架' malloc'ed而不是在堆栈!)
请提出3个问题:
问题#1
我被告知JS中的所有功能都会创建Closures。
什么 ???如果我用私有变量创建一个普通函数,它只是创建一个范围。没有关闭。
我认为关闭工作如下:(from here)
- 制作一个外部的“功能制造者”功能。
- 在其中声明一个局部变量。
- 在外部函数内声明一个内部函数。
- 在内部函数中使用外部函数的变量。
- 让外部功能返回内部功能
- 运行该函数,并将其返回值分配给变量
醇>
例如:
function functionMaker(){
var x = 1;
function innerFunction(){
alert(x);
x++;
}
return innerFunction;
}
那么为什么他们说每个js函数都会创建闭包?
问题#2
Self-Invoking Functions
又称IEFA - Immediately Invoked Function Expression
会创建一个闭包吗?
看着
(function (a) {
alert(a);
})(4);
我没有从上面看到类似 6规则的模式:
Have the outer function return the inner function
到底在哪里?我没有看到return
这个词。
问题#3
function myFunction() {
var myVar = 1;
var alertMyVar = function () {
alert('My variable has the value ' + myVar);
};
setTimeout(alertMyVar, 1000 * 3600 * 24);
}
myFunction();
这里myFunction
一整天都活着吗?或者setTimeout
之后很快就结束了?如果是这样,SetTimeOut
如何记住该值?
请帮助我做对。
答案 0 :(得分:8)
所有功能调用都会创建一个闭包。需要注意的重要一点是闭包是否会持续超出函数调用的生命周期。
如果我执行立即执行的功能:
var value = (function() {
return 4;
})();
然后创建一个闭包,但在函数返回时被丢弃。为什么?因为在闭包中定义的符号没有幸存的引用。但是在这里:
var value = function() {
var counter = 0;
return function() {
return counter++;
};
}();
闭包在紧接着执行的函数之后继续存在,因为它返回另一个函数,该函数又包括对原始函数中定义的“计数器”符号的引用。因为返回的函数仍然是“活动的”,所以闭包必须由运行时系统保留。
请注意:
var value = function() {
return function(a) {
return "hello " + a;
};
}();
即使外部立即执行的函数返回一个函数,该函数也不引用外部函数中的任何符号,因此不需要保留闭包。
我想我想说的是,将闭包视为执行函数效果的一部分是有帮助的,而不是严格地说是静态的结构性事物。有可能有一个有时创建持久闭包的函数,但并非总是如此。