[JS](14)グローバル変数の問題

1836 ワード

変数のライフサイクル


変数は生物と類似しており、生成と消滅のライフサイクルがある.
宣言されたメモリ容量は消えないので、いつまでも使用できません.
変数は自分で宣言した位置で生成され、消滅します!
変数によっては、
  • グローバル変数:アプリケーションのライフサイクルと同じです.
  • 関数内部で宣言された領域変数:関数が呼び出されると生成され、関数が終了すると消失します.
  • fucntion foo() {
    	var x = 'local';
        	console.log(x); //x
            return x;
            }
            
    foo();
    console.log(x); // ReferenceError : x is not defined
    varと宣言された変数は、関数反発を起こし、他の文が実行される前に実行され、宣言されますが、厳密にはグローバル変数に限られます.varが関数走査を有するように、varにおけるhoistingも関数体単位で区分される.
    上記のコードの関数foo()が実行されると、foo()の関数内で宣言されたxは、関数内で他のコードよりも高くなり、undefinedに初期化される.
    その後,関数が終了するとx変数も消失し,ライフサイクルが終了する.
    つまり.ゾーン変数のライフサイクルは関数のライフサイクルと一致します!

    実行を終了した関数を参照する場合。


    変数のライフサイクルは、メモリ領域から解放され、使用可能なメモリプールに戻る時間です.
    関数が呼び出されると、内部変数は消えますか?いいえ.変数の生存の有無は関数の呼び出しによって決まるのではなく,登録されたscopeの消失の有無によって決まる.指定されたメモリ領域が参照されていない場合、ゴミ収集器(GC)によって解放され、使用可能なメモリプールに戻されます.
    史考夫を参照するのはどういう意味ですか.
    (それを完全に理解するには、Lexical環境、Closerなどを知る必要があります…ゆっくりと対応していきます.)
    var x = 'global';
    
    function foo() {
    	console.log(x); 
        	var x = 'local'; 
            }
            
    foo(); // 1번 ?
    console.log(x); // 2번 ?
    )👇
    1番の正解はUndefind、2番の正解はGlobalです.
    1つ目の理由は、foo()関数の実行後、コードブロック内で変数x(このときxは領域変数)を反発し、undefinedに空きメモリ空間を割り当てたからである.
    2号はfoo()関数の終了後、xのライフサイクルが終了し、このscopeで定義されたグローバル変数globalを返します.

    グローバル変数のライフサイクル


    グローバル変数は、領域変数のように関数の開始または終了ではありません.
    しかし、このように自由に見えるグローバル変数は、実際にはJavaScriptエンジンが任意のオブジェクトより先に生成した特殊なオブジェクトのPropertyに属している.このオブジェクトはグローバルオブジェクトと呼ばれ、ブラウザ環境ではウィンドウ、サーバがグローバルオブジェクトを表します.
    グローバル変数は、自身のスキャン(グローバルオブジェクト)のライフサイクルと同じライフサイクルを有します.これは、sonwindowページを閉じるかjavascriptコード全体の実行を停止する前に有効であることを意味します.