0

Learning to Love JavaScriptを見ていると、この2番目のバージョンが機能しない理由に夢中になりました。'function'を返すだけです。クロージャに変数を直接割り当てることは許可されていませんか?

function getCtr() {
    var i = 0;
    return function() {
        console.log(++i);
    }
}
var ctr = getCtr();
ctr();
ctr();
ctr();
/* console
1
2
3
*/
/*--------------------------------------
 *   This doesn't work
 */
var ctr = function() {
    var i = 0;
    return function() {
        console.log(++i);
    }
}
ctr();
ctr();
ctr();
/*   console
 *   => [Function]
 */

ビデオリンクhttp://youtu.be/seX7jYI96GE?t=11m12s

4

2 に答える 2

4

関数が関数を返すので、それを出力します。

試す

ctr()();

使用した2つの形式の関数宣言は、ほぼ同じ効果があります。どちらも関数を作成し、それをシンボルにバインドするだけです。2番目のバージョンで実際に変更したのは、関係する名前( "getCtr"ではなく"ctr")だけです。

つまり、テストが最初のセットアップのようだった場合:

var actualCtr = ctr();

actualCtr();
actualCtr();
actualCtr();

あなたはそれが本当に同じであることがわかるでしょう。

于 2012-07-17T19:26:38.827 に答える
1

最初のバージョンでは、関数 getCtr を定義します。次に、getCtr を呼び出し、結果を ctr として保持します。次に、ctr を繰り返し呼び出します。関数を呼び出した結果を呼び出しています。

2 番目のバージョンでは、最初の関数として ctr を定義し、それを繰り返し呼び出します。関数を呼び出した結果を呼び出していません。

動作する 2 番目のコードのバージョンは次のとおりです。

var ctr = (function() {
        var i = 0;
        return function() {
            console.log(++i);
        }
    })();
ctr();
ctr();
ctr();
于 2012-07-17T19:31:12.843 に答える