ホームページ  >  記事  >  ウェブフロントエンド  >  あなたの友人の JavaScript コードは実際にクロージャを使用していますか?

あなたの友人の JavaScript コードは実際にクロージャを使用していますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-01 06:11:02450ブラウズ

Is Your Friend's JavaScript Code Actually Using Closures?

JavaScript のクロージャと匿名関数

質問:

JavaScript のクロージャについての議論の中で、ある友人が次のように主張しました。彼らの実装にはクロージャが欠けていましたが、もう一方は反対のことを主張していました。クロージャの概念を適用して、どのソリューションがクロージャを使用しているかを判断できますか?

解決策:

クロージャ定義: JavaScript のクロージャは、別のスコープから参照される自由変数 (親スコープで定義された変数) を持つ関数のサブセット。クロージャが親スコープの外で参照されると、そのスコープから上位値 (自由変数) を超えてクローズされます。

ケース 1: 友達のプログラム

<code class="js">for (var i = 0; i < 10; i++) {
    (function f() {
        var i2 = i;
        setTimeout(function g() {
            console.log(i2);
        }, 1000);
    })();
}</code>

分析:

  • すべての自由変数 (i、setTimeout、および console) がグローバル スコープにバインドされており、どれも閉じられていないため、関数 f はクロージャではありません。
  • ただし、関数 g は、f のスコープにバインドされている変数 i2 を閉じるため、クロージャです。 g が setTimeout 内から参照されると、i2 へのアクセスが保持されます。

ケース 2: プログラム

<code class="js">for (var i = 0; i < 10; i++) {
    setTimeout((function f(i2) {
        return function g() {
            console.log(i2);
        };
    })(i), 1000);
}</code>

分析:

  • 関数 f は自由変数がないため、クロージャではありません。
  • ただし、関数 g は、バインドされている変数 i2 を閉じるため、クロージャです。 fの範囲に。 g が setTimeout 内から参照されると、i2 へのアクセスが保持されます。

結論:

あなたもあなたの友人も、実装でクロージャを使用しています。違いは、友人のプログラムではクロージャが内部関数 g 内で作成されるのに対し、あなたのプログラムではクロージャが外部関数 f 内で作成されることです。

以上があなたの友人の JavaScript コードは実際にクロージャを使用していますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。