1. 程式人生 > >js-變數提升

js-變數提升

 

一:Js解析機制

遇到 script 標籤的話 js 就進行預解析,將變數 var 和 function 宣告提升,但不會執行 function,然後就進入上下文執行,上下文執行還是執行預解析同樣操作,直到沒有 var 和 function,就開始執行上下文

二:

 函式宣告和變數宣告總是會被直譯器悄悄地被"提升"到方法體的最頂部。

三:函式宣告提升

a=5;

show();

var a;

function show(){};

預解析:

function show(){}; // 函式的宣告

var a; // 變數的宣告

a=5;

show();

注意:需要注意都是函式宣告提升直接把整個函式提到執行環境的最頂端

 

除了以上的函式宣告方式外,還可以使用匿名函式的方式。使用匿名函式的方式不存在函式提升因為函式名稱使用變量表示的,只存在變數提升

var getName=function(){

  console.log(2);

}

function getName(){

  console.log(1);

}

 

getName

();// 2

預解析:

//函式、變數宣告提升後

function getName(){    //函式宣告提升到頂部

  console.log(1);

}

var getName;    //變數宣告提升

getName = function(){    //變數賦值依然保留在原來的位置

  console.log(2);

}

getName();    // 最終輸出:2

四:變數提升:


    x=5;
    elem=document.getElementById("demo");
    elem.innerHTML=x; // 使用後宣告
    var x;

//    預解析
    var x;
    x=5;
    elem=document.getElementById("demo");
    elem.innerHTML=x;
----------------------------------------------------------------------------
    var a=7;
    console.log("++++++++++a",a)
    console.log("++++++++++b",b) // undefined;因為只是 變數宣告提升,初始化沒有提升
    var b=7;

//    預解析

    var a=7;
    var b;
    console.log("++++++++++a",a)
    console.log("++++++++++b",b) // undefined(宣告無初始化);因為只是 變數宣告提升,初始化沒有提升
    b=7;