尽管我读了很多文章,但仍然有一些问题。
我已经知道(并理解)闭包的用法,比如:
臭名昭著的Loop问题(链接循环,每个链接都有警报,并保留编号)
增加计数器(不断调用一个函数 -> 警报增加的数字)
来自这里:
内部函数引用其外部函数的局部变量会创建闭包
来自这里:
闭包是函数的本地变量-在函数返回后保持活动状态,或者闭包是未在函数返回时取消分配的堆栈帧。(就像“堆栈帧”被malloc而不是在堆栈上!)
3个问题:
问题#1
有人告诉我JS中所有的函数都会创建闭包。
什么?如果我创建一个带有私有变量的普通函数,它只会创建作用域,而不是闭包。
我认为闭包的工作方式是这样的:(来自这里)
- 创建一个外部“函数制造器”函数。
- 在其中声明一个局部变量。
- 在外部函数内声明一个内部函数。
- 在内部函数中使用外部函数的变量。
- 让外部函数返回内部函数
- 运行该函数,并将其返回值分配给一个变量
示例:
function functionMaker(){
var x = 1;
function innerFunction(){
alert(x);
x++;
}
return innerFunction;
}
那么为什么他们说每个js函数都创建闭包?
问题 #2
自执行函数
,又称IEFA(立即调用函数表达式),是否会创建一个闭包?
看一下:
(function (a) {
alert(a);
})(4);
我并没有看到像上面提到的那样的“6条规则”模式: “将外部函数返回内部函数”的部分在哪里?我没有看到“return”这个单词。
第三个问题。
function myFunction() {
var myVar = 1;
var alertMyVar = function () {
alert('My variable has the value ' + myVar);
};
setTimeout(alertMyVar, 1000 * 3600 * 24);
}
myFunction();
我的函数 myFunction
一直存在吗?还是在 setTimeout
后立即结束了?如果是,SetTimeOut
是如何“记住”那个值的?
请帮我理解正确。
function
关键字需要消除歧义时才是必要的。在等号表达式的右侧没有歧义,因此括号是不必要的。 - Pointy