4

私はまだ JavaScript のクロージャーに頭を悩ませています (記録として、スタック オーバーフローの JavaScript クロージャーへの回答と、「ダミーのための JavaScript クロージャー」を読みましたが、まだ戸惑っています)。

私の主な問題は、関数内で別の関数を宣言することの重要性を理解するのに苦労していることです。内部関数を返すと、外部関数のローカル変数がアクティブなままになることがわかりますが、この例ではまだそうではありませんか?

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

var sayJohn = sayName("John");

ローカル変数「say」は、私が作成した sayJohn() 関数のローカル スコープ外で参照されています。それで、これはまだ閉鎖を作成していませんか?

NB、これがすべて文字化けしているように聞こえることをお詫びします。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 に答える