原理: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); };