JSにおける変数の向上を深く理解する

11170 ワード

1、JSの事前解析メカニズム


変数を上げる前に、JSの事前解析メカニズムを理解しておきましょう.
JSの解析とJSを実行する解析プロセスは,プリコンパイル期間(プリプロセッシング,プリプロセッシング,プリコンパイル)と実行期間の2段階に分けられる.
簡単に言えば、 とは、現在の役割ドメイン内(現在の役割ドメインはグローバル役割ドメインである可能性もあり、現在の関数のローカル役割ドメインである可能性もあることに注意してください)であり、JavaScriptはコードを実行する前に、ブラウザがデフォルトでvarとfunction宣言付きの変数を事前に宣言または定義します.
var宣言の変数とfunction宣言の関数の事前解析には別のものがあり、var宣言の変数の事前解析は事前の宣言にすぎず、function宣言の関数は事前に宣言され、同時に定義されます.これらの違いは、宣言と同時に定義されるかどうかです.

2、変数の昇格


ES 6以前はvarを使用して変数を宣言していましたが、アップグレードは簡単に言えばvar a=12に似ています.まずaの宣言を現在の役割ドメインの先端で実行し、私たちのコードの位置に値を割り当てます.
console.log(a); // undefined
var a = 12;

//           
var a;
console.log(a);
a = 12;

次は古典的な面接問題を見てみましょう.
console.log(v1);
var v1 = 100;
function foo() {
    console.log(v1);
    var v1 = 200;
    console.log(v1);
}
foo();
console.log(v1);

結果は
//undefined
//undefined
//200
//100

少し愚かではないでしょうか.ここでは基礎知識について説明する必要があります.上位領域で宣言する変数はwindowレベルの変数であり、上記のコードの最初のv 1のようにwindowと理解できる.v1 = 100
上のコードの解析プロセスは
var v1;
console.log(v1);
v1 = 100;// window.v1 = 100;
function foo() {
	var v1;
    console.log(v1);
    v1 = 200;
    console.log(v1);
}
foo();
console.log(v1); // console.log(window.v1);
//                ,                 
//undefined
//undefined
//200
//100

3、関数の昇格


JavaScriptには通常の変数のリフティングだけでなく,関数の変数リフティングもある.名前付き関数の宣言には2つあります.1、関数式宣言2、関数数値面量宣言
//      
function foo(){
	console.log(1);
}

//        
var foo = function(){
	console.log(w);
}

関数の字面量式の宣言変数の昇格の結果は同じで、関数は具体的な値にすぎない.

console.log(foo);
function foo () {
  console.log(1);
}
//    :
// ƒ foo () {
//  console.log(1);
// }

実行順序は次のとおりです.
function foo () {
  console.log(1);
}
console.log(foo);

関数優先は昇格過程で、関数優先は昇格し、次に変数昇格である.関数(function a(){})のみが昇格し、関数式は無視され(var a=function(){})、同じ関数宣言で、後は前を上書きします.
foo(); // 1
var foo;
function foo(){
  console.log(1);
}
foo = function(){
  console.log(2);
}

これを
function foo(){
  console.log(1);
}
foo(); // 1
foo = function(){
  console.log(2);
}