var的變量提升的底層原理是什么?


原理:JS引擎的工作方式是①先解析代碼,獲取所有被聲明的變量;②然后在運行。也就是專業來說是分為預處理和執行兩個階段。

變量提升的定義:所有變量的聲明語句都會被提升到代碼頭部,這就是變量提升。

例如:

console.log(a);
var a =1;

 

以上語句並不會報錯,只是提示undefined。實際在js引擎中的運行過程是:

var a;
console.log(a);
a =1;

實際運行表示變量a已聲明,但還未賦值。

 

但是變量提升只對var命令聲明的變量有效,如果一個變量不是用var命令聲明的,就不會發生變量提升。

console.log(aa);
aa =1;

以上代碼將會報錯:ReferenceError: aa is not defined

 

補充:js里的function也可看做變量,也存在變量提升情況

a();

function a(){
    console.log(1);
};

表面上,上面代碼好像在聲明之前就調用了函數a。但是實際在js引擎中,由於“變量提升”,函數a定義部分被提升到了代碼頭部,也就是在調用之前已經聲明了。

但是!如果采用賦值語句定義函數,JavaScript就會報錯:

a();

var a = function(){
    console.log(1);
};

// TypeError: a is not a function

因為js引擎把變量聲明提升,此時,a就是一個變量,而並不是一個function,以下是js引擎實際運行代碼:

var a;
a();

a = function(){
    console.log(1);
};

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM