在JavaScript中关闭闭包的函数中声明另一个函数有什么意义?

时间:2013-01-07 02:03:00

标签: javascript closures

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

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

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

var sayJohn = sayName("John");

本地变量“say”仍然在我创建的sayJohn()函数的本地范围之外被引用。 那么这还不能创造一个闭合吗?

N.B我为这一切听起来有点乱而道歉,对于学习JavaScript和编程一般来说还是非常新鲜的,所以请放轻松我吧!

3 个答案:

答案 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是一个函数引用,即使在从调用堆栈中删除外部函数之后,外部函数变量仍保持活动状态