Javascript闭包澄清?
尽管我读了很多文章,我仍然有一些问题 我已经知道(并理解)闭包的用法,如:Javascript闭包澄清?,javascript,closures,Javascript,Closures,尽管我读了很多文章,我仍然有一些问题 我已经知道(并理解)闭包的用法,如: 臭名昭著的循环问题(链接循环,每个链接上都有保持编号的警报) 增加的计数器(继续调用函数->提醒增加的数字) 发件人: 内部函数是指外部函数的局部变量 创建闭包 发件人: 闭包是函数的局部变量,在 函数已返回,或者闭包是一个堆栈帧,但它不是 当函数返回时解除分配。(就好像一个“堆栈帧”是 malloc'ed而不是在堆栈上!) 请回答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
问题#3
function myFunction() {
var myVar = 1;
var alertMyVar = function () {
alert('My variable has the value ' + myVar);
};
setTimeout(alertMyVar, 1000 * 3600 * 24);
}
myFunction();
myFunction
在这里一整天都是活动的吗?还是在设置超时后立即结束?如果是这样的话,SetTimeOut
是如何记住这个值的
请帮我把它弄对。所有函数调用创建一个闭包。需要注意的重要一点是,闭包是否会持续到函数调用的生命周期之外
如果我执行了立即执行的功能:
var value = (function() {
return 4;
})();
然后创建一个闭包,但在函数返回时丢弃。为什么?因为没有对闭包中定义的符号的幸存引用。但在这里:
var value = function() {
var counter = 0;
return function() {
return counter++;
};
}();
闭包在立即执行的函数之后继续存在,因为它返回另一个函数,而该函数又包含对原始函数中定义的“计数器”符号的引用。因为返回的函数仍然是“活动的”,所以闭包必须由运行时系统保留
请注意,此处:
var value = function() {
return function(a) {
return "hello " + a;
};
}();
即使外部立即执行的函数返回函数,该函数也不会引用外部函数中的任何符号,因此无需保留闭包
我想我想说的是,把闭包看作是执行函数效果的一部分是有帮助的,而不是严格地说是一个静态的、结构化的东西。有一个函数有时可以创建一个持久的闭包,但并不总是这样。谢谢。这与我的第三个问题有关吗<代码>超过函数调用的生存期
?请记住:JavaScript IIFE必须有括号:(function(){})()代码>@WaleedKhan不,那不是真的。只需消除函数
关键字的歧义。在=
表达式的右侧没有歧义,因此括号是不必要的。@Pointy Well在Mobile Safari编辑中似乎是正确的:我站着更正。@RoyiNamir您所有的问题都是相互关联的:-)每个函数调用都创建一个闭包。