javascript變量聲明提升

遇到了JS的變量聲明提升,英文名為Hosting,具體來講是指JS在對當(dāng)前作用域中的聲明代碼,會(huì)將其提升至當(dāng)前作用域的最頂端。本文通過幾個(gè)示例來詳細(xì)理解一下:

示例一

  • 正常預(yù)期的輸出
var myvar = 'my value'; 
  
(function() { 
  alert(myvar); 
})();

這種情況下,在瀏覽器中執(zhí)行,會(huì)看到 my value 的提示框。

  • 異常不符合預(yù)期的輸出
var myvar = 'my value'; 
  
(function() { 
  alert(myvar);
  var myvar = 'local value'; 
})();

這時(shí),我們確得到的輸出資料是 undefined 。并不是全局的 myvar,這就是因?yàn)樵趂unction的作用域內(nèi),將變量myvar的聲明提升至 alert的上方,等同于下面的代碼:

var myvar = 'my value'; 
  
(function() { 
  var myvar;
  alert(myvar);
  myvar = 'local value'; 
})();

示例二

(function (){
   newFuntion();
   var newFuntion = function(){
      alert("hello word");
   }
})();

這段代碼將不會(huì)有任何輸出,但會(huì)得到一個(gè)錯(cuò)誤信息,Uncaught TypeError: newFuntion is not a function??梢钥闯?,其也會(huì)對函數(shù)的變量聲明也會(huì)進(jìn)行提升,等同于這段代碼:

(function (){
   var newFuntion; 
   newFuntion();
   newFuntion = function(){
      alert("hello word");
   }
})();

但是,這樣調(diào)用就不會(huì)出錯(cuò):

(function (){
   newFuntion();
   function newFuntion(){
      alert("hello word");
   }
})();

這是函數(shù)聲明的寫法,會(huì)優(yōu)先在當(dāng)前作用域進(jìn)行函數(shù)的注冊,所以調(diào)用的時(shí)候,函數(shù)已經(jīng)存在,沒有問題。

示例三

var a = 1;  
function b() {  
    a = 10;  
    return;  
    function a() {} 
}  
b();  
alert(a);

這個(gè)示例的輸出,給我們的結(jié)果是個(gè)"1"的彈出框,很困惑了有木有?對代碼改動(dòng)一下,

var a = 1;  
function b() {  
    alert(a);
    a = 10;  
    return;  
    function a() {} 
}  
b();  

得到的a 是function a(){}。得到的結(jié)果是其對函數(shù)的聲明。需要注意的是,這里在function b下面的a因?yàn)楹瘮?shù)聲明的問題,已經(jīng)變?yōu)榱艘粋€(gè)局部變量,所以不會(huì)影響全局變量a,所以之前代碼的結(jié)果輸出為1,也就很容易理解了。

總結(jié)

變量聲明的時(shí)候,變量賦值并沒有被提升,只是聲明被提升了。但是,同時(shí)要注意函數(shù)聲明與函數(shù)表達(dá)式的區(qū)別: 函數(shù)聲明會(huì)在當(dāng)前作用域優(yōu)先進(jìn)行注冊,會(huì)產(chǎn)生覆蓋的效果,而函數(shù)表達(dá)式則是按代碼順序進(jìn)行執(zhí)行 。所以下面這段也就容易理解了:

function test() {  
    foo(); // TypeError "foo is not a function"  
    bar(); // "this will run!"  
    var foo = function () { // 變量指向函數(shù)表達(dá)式  
        alert("this won't run!");  
    }  
    function bar() { // 函數(shù)聲明 函數(shù)名為bar  
        alert("this will run!");  
    }  
}  
test();

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • java script的變量聲明具有hoisting機(jī)制,JavaScript引擎在執(zhí)行的時(shí)候,會(huì)把所有變量的聲明...
    MC_DEV_JIN閱讀 431評(píng)論 0 0
  • 摘?。篽ttp://www.jb51.net/article/30719.htm 變量提升 變量提升就是把變量提升...
    潔芬閱讀 199評(píng)論 0 0
  • 繼承 一、混入式繼承 二、原型繼承 利用原型中的成員可以被和其相關(guān)的對象共享這一特性,可以實(shí)現(xiàn)繼承,這種實(shí)現(xiàn)繼承的...
    magic_pill閱讀 1,126評(píng)論 0 3
  • 前言 人生苦多,快來 Kotlin ,快速學(xué)習(xí)Kotlin! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,686評(píng)論 9 118
  • 到卓爾山之前一直不知道這個(gè)地方。卓爾山位于青海省祁連縣八寶鎮(zhèn),緊靠八寶河與藏區(qū)神山阿咪東索(牛心山)隔河相望。9月...
    牧風(fēng)漢子閱讀 360評(píng)論 0 1

友情鏈接更多精彩內(nèi)容