Roy*_*mir 5 javascript closures
正如我读过的文章一样多,我仍然有一些问题.
我已经知道(并理解)关闭的用法,如:
臭名昭着的循环问题(带有保持号码的每个警报的链接循环)
增加计数器(继续调用函数 - >警告增加的数字)
从这里:
引用其外部函数的局部变量的内部函数创建闭包
从这里:
闭包是函数的局部变量 - 在函数返回后保持活动状态,或者闭包是函数返回时未释放的堆栈帧.(好像'stack-frame'是malloc'ed而不是堆栈!)
3个问题请:
问题#1
我被告知JS中的所有函数都创建了Closures.
什么 ??? 如果我用私有变量创建一个普通函数,它只是创建一个范围.没有关闭.
我认为关闭工作是这样的:( 从这里)
- 制作一个外部的"功能制造者"功能.
- 在其中声明一个局部变量.
- 在外部函数内声明一个内部函数.
- 在内部函数中使用外部函数的变量.
- 具有外部函数返回内部函数
- 运行该函数,并将其返回值赋给变量
exmample:
function functionMaker(){
var x = 1;
function innerFunction(){
alert(x);
x++;
}
return innerFunction;
}
Run Code Online (Sandbox Code Playgroud)
那么为什么他们说每个js函数都会创建闭包?
问题2
是否Self-Invoking FunctionsIEFA - Immediately Invoked Function Expression创建一个闭包?
看着
(function (a) {
alert(a);
})(4);
Run Code Online (Sandbox Code Playgroud)
我没有看到像上面的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();
Run Code Online (Sandbox Code Playgroud)
是否myFunction还活着,全日在这里?或者它在结束后很快就结束了setTimeout?如果是这样,怎么SetTimeOut 记得这个价值?
请帮我把它弄好.
所有函数调用都创建一个闭包.需要注意的重要一点是闭包是否会持续超出函数调用的生命周期.
如果我执行立即执行的功能:
var value = (function() {
return 4;
})();
Run Code Online (Sandbox Code Playgroud)
然后创建一个闭包,但在函数返回时丢弃.为什么?因为在闭包中定义的符号没有幸存的引用.但在这里:
var value = function() {
var counter = 0;
return function() {
return counter++;
};
}();
Run Code Online (Sandbox Code Playgroud)
闭包在紧接着执行的函数之后继续存在,因为它返回另一个函数,该函数又包括对原始函数中定义的"计数器"符号的引用.因为返回的函数仍然是"活动的",所以闭包必须由运行时系统保留.
请注意这里:
var value = function() {
return function(a) {
return "hello " + a;
};
}();
Run Code Online (Sandbox Code Playgroud)
即使外部立即执行的函数返回一个函数,该函数也不引用外部函数中的任何符号,因此不需要保留闭包.
我想我想说的是,将闭包视为执行函数效果的一部分是有帮助的,而不是严格地说是一个静态的结构性东西.有可能有一个函数有时会创建一个持久的闭包,但并非总是如此.