我仍然在努力思考JavaScript中的闭包(为了记录,我已经在Stack Overflow上阅读了JavaScript闭包的答案,再加上“用于傻瓜的JavaScript闭包”,我仍然对它们感到困惑)
我的主要问题是我无法理解在函数中声明另一个函数的重要性;我得到返回的内部函数允许外部函数的局部变量保持活动状态,但在这个例子中是不是仍然如此?
function sayName(name) {
var say = "Hello, " + name;
alert(say);
}
var sayJohn = sayName("John");
本地变量“say”仍然在我创建的sayJohn()函数的本地范围之外被引用。 那么这还不能创造一个闭合吗?
N.B我为这一切听起来有点乱而道歉,对于学习JavaScript和编程一般来说还是非常新鲜的,所以请放轻松我吧!
答案 0 :(得分:6)
你的榜样确实无法表现出封闭的力量。 请看一下:
function makeAdder(add1){
return function(add2){
return add1 + add2;
};
}
// add10 is a function which increments the input by 10(that's the closure's magic)
var add10 = makeAdder(10);
add10(12); // returns 22
add10(9); // returns 19
答案 1 :(得分:2)
虽然@ HuiZheng的答案是正确的,但这里有一个更简单的闭包用例:
var getUniqueID = (function () {
var counter = 0;
return function () {
return counter++;
};
}());
getUniqueID(); // 0
getUniqueID(); // 1
getUniqueID(); // 2
答案 2 :(得分:0)
说没有在sayName函数之外引用。 “alert”是从sayName函数内部调用的,因此仍然在sayName范围内。
closure是一个函数引用,即使在从调用堆栈中删除外部函数之后,外部函数变量仍保持活动状态