我已经阅读了有关js闭包的所有内容,但无法理解以下代码:
function main(condition){
var a;
if (condition){
a="aaa";
}
else
{
a="bbb";
return;
}
button.addEventListener("click", function(){ alert(a);});
}
main(true);
main(false);
之后点击按钮。结果是:" aaa"。 Doest这意味着嵌套函数不保留对变量的引用而是复制它们吗?请解释一下。
答案 0 :(得分:2)
第一次运行main
时,将"aaa"
分配给a
(这是一个局部变量),然后绑定一个读取该变量的事件处理程序。
第二次运行main
时,您将"bbb"
分配给a
(因为这是函数的另一个调用,它是不同的局部变量)。您不绑定事件处理程序,该事件处理程序首先从return
读取该变量。
当点击事件触发时,它运行的函数在第一次调用的a
范围内,而不是第二次调用,因此值为"aaa"
。
答案 1 :(得分:0)
我想说这就是关闭的全部内容。关闭是"内部功能"保留对有效"有效"的变量值的访问权限。在内部功能即使在"外部功能"之后创建的那一刻返回。
考虑以下示例:
var outerFunc = function(a) {
return function (x) {
return x+a;
}
} //the outer function returns a function
现在让我们调用外部函数并将返回的值存储在变量newFunc中:
var newFunc = outerFunc(15); //the outer function has been invoked, newFunc is a function
newFunc(1); //let's invoke the resulting "inner function"
结果将是16.内部函数将始终记住值15,即使您使用其他参数值调用外部函数也是如此。这就是JavaScript的工作原理。
在您的示例中,事件监听器发生了非常类似的事情。内部功能(带警报)被注册为对点击事件的反应,它始终记住' a的价值。当你按下按钮时,这会调用这个“内心”按钮。功能
答案 2 :(得分:0)
要获得您可能需要的行为,请尝试:
var main = function () {
var a;
return function() {
if (condition){
a="aaa";
}
else
{
a="bbb";
return;
}
button.addEventListener("click", function(){ alert(a);});
};
}();
main(true);
main(false);
这是有效的,因为它以一种在函数调用中持续存在的方式定义a
,正如另一个回答者所指出的那样,这是问题所在。
答案 3 :(得分:-1)
这不是一个闭包,它只是对一个函数的双重调用,当它为true时它会添加事件监听器以便它打印'aaa'但第二次没有添加一个事件,因为它在添加它之前返回