4

我仍然在努力思考 JavaScript 中的闭包(作为记录,我已经在 Stack Overflow 上阅读了 JavaScript 闭包的答案,以及“傻瓜的 JavaScript 闭包”,但仍然对它们感到困惑)。

我的主要问题是我无法理解在函数中声明另一个函数的重要性;我知道返回内部函数允许外部函数的局部变量保持活动状态,但在这个例子中不是这样吗?

function sayName(name) {
var say = "Hello, " + name;
alert(say);
}

var sayJohn = sayName("John");

在我创建的 sayJohn() 函数中,局部变量“say”仍在其局部范围之外被引用。那么这不是还在创建一个闭包吗?

请注意,对于这一切听起来多么混乱,我深表歉意,对于学习 JavaScript 和一般编程来说仍然很新鲜,所以请放轻松!

4

3 回答 3

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
于 2013-01-07T02:08:42.160 回答
2

虽然@HuiZheng 的回答是正确的,但这里有一个更简单的闭包用例:

var getUniqueID = (function () {
    var counter = 0;

    return function () {
        return counter++;
    };
}());

getUniqueID(); // 0
getUniqueID(); // 1
getUniqueID(); // 2
于 2013-01-07T02:11:31.933 回答
0

say 没有在 sayName 函数之外被引用。“alert”是从 sayName 函数内部调用的,因此仍在 sayName 的范围内。

闭包是一个函数引用,即使在外部函数已从调用堆栈中删除后,它仍然保持外部函数变量处于活动状态

于 2013-01-07T02:11:23.933 回答