JavaScript では匿名関数は常にクロージャになりますか?

Susan Sarandon
リリース: 2024-11-01 11:02:30
オリジナル
328 人が閲覧しました

Are Anonymous Functions Always Closures in JavaScript?

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

JavaScript のクロージャーは、一部の開発者にとって混乱の対象となっています。すべての JavaScript 関数はクロージャですが、特定のサブセットが特に理論的に興味深いものです。この記事は、概念を明確にし、2 つのコード ブロックのうちどちらがクロージャを正確に利用しているかを判断することを目的としています。

クロージャについて:

クロージャは、へのアクセスをキャプチャして維持する関数です。スコープがアクティブでなくなった後でも、そのスコープを囲んでいるスコープから変数を削除します。本質的に、クロージャはメモリを持ち、「親スコープ変数」または「上位値」として知られる親スコープからデータにアクセスできる関数です。

クロージャの識別:

関数がクロージャであるかどうかを判断するには、その変数を調べる必要があります。非ローカル変数 (つまり、自由に変更できる変数) を持たない関数はクロージャになることができません。非ローカル変数を持つ関数は、クロージャになるために親スコープの外から参照される必要があります。

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

<code class="javascript">for(var i = 0; i < 10; i++) {
    (function(){
        var i2 = i;
        setTimeout(function(){
            console.log(i2);
        }, 1000)
    })();
}</code>
ログイン後にコピー

この場合、関数はは閉じられた親スコープ変数がないため、クロージャではありません。ただし、setTimeout に渡される内部関数は、自由変数 i2 へのアクセスをキャプチャして維持するため、クロージャです。

ケース 2: 作成者のプログラム

<code class="javascript">for(var i = 0; i < 10; i++) {
    setTimeout((function(i2){
        return function() {
            console.log(i2);
        }
    })(i), 1000);
}</code>
ログイン後にコピー

こちら、内部関数は自由変数 i2 へのアクセスを維持し、親スコープの外で参照された場合でもクロージャのままです。

結論:

どちらの場合も、クロージャが利用されます。 。著者のプログラムは、i の値を適切に取得するためにクロージャを採用しています。別の関数を返し、それを setTimeout に渡すことによって、内部関数はクローズドオーバー変数 i2 にアクセスできます。これにより、遅延後に正しい値がコンソールに出力されます。

以上がJavaScript では匿名関数は常にクロージャになりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!