亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JavaScript變量提升

Zoom / 3560人閱讀

摘要:變量提升需要注意兩點(diǎn)提升的部分只是變量聲明,賦值語(yǔ)句和可執(zhí)行的代碼邏輯還保持在原地不動(dòng)提升只是將變量聲明提升到變量所在的變量范圍的頂端,并不是提升到全局范圍,說(shuō)明如下會(huì)輸出變量提升之后的效果函數(shù)聲明會(huì)提升,但是函數(shù)表達(dá)式就不了。

問(wèn)題

有些朋友可能會(huì)覺(jué)得javascript的代碼是從上到下,一行一行的解釋執(zhí)行的。如果按照這樣的思路,在有些情況下閱讀代碼會(huì)得到錯(cuò)誤的結(jié)果,考慮以下代碼:

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

console.log(a)應(yīng)該輸出什么呢?有些開(kāi)發(fā)者覺(jué)得會(huì)輸出undefined,因?yàn)?b>var a在"a = 2"之后,變量a被重復(fù)定義了,但是沒(méi)有被賦值,所以是"undefined"。但是結(jié)果輸出是2。如下圖所示:

我們?cè)賮?lái)考慮另一段代碼,如下所示:

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

這段代碼會(huì)輸出什么樣的結(jié)果呢?有些人可能會(huì)覺(jué)得輸出ReferenceError。因?yàn)樽兞?b>a在沒(méi)有聲明的情況下就被使用了。真實(shí)結(jié)果呢,如下圖所示:輸出的是undefined

為什么會(huì)這樣呢?這就牽出了本文的主題:JavaScript聲明提升

JavaScript代碼的運(yùn)行規(guī)則

在JavaScript代碼運(yùn)行之前其實(shí)是有一個(gè)編譯階段的。編譯之后才是從上到下,一行一行解釋執(zhí)行。變量提升就發(fā)生在編譯階段,它把變量和函數(shù)的聲明提升至作用域的頂端。(編譯階段的工作之一就是將變量與其作用域進(jìn)行關(guān)聯(lián))。
所以對(duì)于代碼var a =2;來(lái)說(shuō),編譯器看到的是兩行代碼var a; a = 2;第一個(gè)語(yǔ)句是聲明語(yǔ)句,在編譯階段處理。第二個(gè)語(yǔ)句是賦值語(yǔ)句,在運(yùn)行階段處理。
那么我們?cè)倩剡^(guò)頭來(lái)看看問(wèn)題中出現(xiàn)的代碼:

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

應(yīng)該這樣來(lái)處理:

var a;            //編譯階段
a = 2;            //運(yùn)行階段
console.log(a);   //運(yùn)行階段

所以這段代碼的最終輸出的結(jié)果是2。

第二段代碼:

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

應(yīng)該這樣來(lái)處理:

   var a;            //編譯階段
   console.log(a);   //運(yùn)行階段 
   a = 2;            //運(yùn)行階段

所以這段代碼的最終輸出結(jié)果是undefined

變量提升需要注意兩點(diǎn):

提升的部分只是變量聲明,賦值語(yǔ)句和可執(zhí)行的代碼邏輯還保持在原地不動(dòng)

提升只是將變量聲明提升到變量所在的變量范圍的頂端,并不是提升到全局范圍,說(shuō)明如下:

foo();
function foo(){
    console.log(a); //會(huì)輸出undefined
    var a = "2";
}
//變量提升之后的效果
function foo(){
    var a;
    console.log(a);
    a = "2";
}
foo();

函數(shù)聲明會(huì)提升,但是函數(shù)表達(dá)式就不了??慈缦麓a:

foo();
var foo = function bar(){    //這是一個(gè)函數(shù)表達(dá)式,不再是函數(shù)聲明。
    console.log("bar");
}

處理方式如下:

var foo;    
foo();    //TypeError,因?yàn)檫€沒(méi)有賦值
bar();    //bar不可以在全局范圍內(nèi)引用
foo = function bar(){            
    console.log("bar");
}    
函數(shù)是一等公民

變量聲明和函數(shù)聲明都會(huì)得到變量提升,但函數(shù)聲明會(huì)最先得到提升,然后是變量聲明。
考慮如下代碼:

foo();    //輸出的結(jié)果為1
var foo;
function foo(){
    console.log(1);
}
foo = function(){
    console.log(2);
}   

處理方式如下:

function foo(){
    console.log(1);
} 
foo();
foo = function(){
    console.log(2);
}   

注意var foo;由于是重復(fù)聲明變量,所以被編譯優(yōu)化去掉。

最后再來(lái)說(shuō)明幾種情況

對(duì)于函數(shù)聲明來(lái)說(shuō),如果定義了相同的函數(shù)變量聲明,后定義的聲明會(huì)覆蓋掉先前的聲明,看如下代碼:

foo();    //輸出3
function foo(){
    console.log(1);
}
var foo = function(){
    console.log(2);
}  
function foo(){
    console.log(3);
} 

JavaScript中是沒(méi)有塊級(jí)作用域的概念(ps:ES6中有改進(jìn)了),看如下代碼:

foo();    //輸出結(jié)果為2
var a = true;
if(a){
    function foo(){
        console.log(1);
    }
}else{
    function foo(){
        console.log(2);
    }
}   

這段代碼輸出結(jié)果為2,if語(yǔ)句沒(méi)有塊級(jí)作用域的功能,所以函數(shù)聲明都被提升到全局作用域中,又因?yàn)槎x了兩個(gè)foo,后來(lái)的定義覆蓋了前邊的定義,所以輸出結(jié)果為2。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/86101.html

相關(guān)文章

  • Javascript中的變量提升、函數(shù)提升變量訪問(wèn)原則

    摘要:變量提升什么是變量提升在函數(shù)體內(nèi)聲明的變量,無(wú)論你是在函數(shù)的最底端還是中間聲明的,那么都會(huì)把該變量的聲明提升到函數(shù)的最頂端相當(dāng)于第一行,但是只是提升變量的聲明,不會(huì)賦值。 1、變量提升 什么是變量提升?在函數(shù)體內(nèi)聲明的變量,無(wú)論你是在函數(shù)的最底端還是中間聲明的,那么都會(huì)把該變量的聲明提升到函數(shù)的最頂端(相當(dāng)于第一行),但是只是提升變量的聲明,不會(huì)賦值。 var num = 10; fu...

    zhigoo 評(píng)論0 收藏0
  • JavaScript變量提升

    摘要:發(fā)布自的博客,歡迎大家轉(zhuǎn)載,但是要注意注明出處。另外,該文章收納在的個(gè)人的知識(shí)整理倉(cāng)庫(kù),歡迎投稿介紹變量提升是人們對(duì)執(zhí)行上下文工作方式的一種認(rèn)識(shí),并不是官方給出的改變從字面上理解,變量提升的意思是變量和函數(shù)的聲明會(huì)在物理層移動(dòng)到作用域的最前 發(fā)布自Kindem的博客,歡迎大家轉(zhuǎn)載,但是要注意注明出處。另外,該文章收納在Kindem的個(gè)人的 IT 知識(shí)整理倉(cāng)庫(kù),歡迎 Star、Fork、...

    yzd 評(píng)論0 收藏0
  • ES6 變量作用域與提升變量的生命周期詳解

    摘要:不同的是函數(shù)體并不會(huì)再被提升至函數(shù)作用域頭部,而僅會(huì)被提升到塊級(jí)作用域頭部避免全局變量在計(jì)算機(jī)編程中,全局變量指的是在所有作用域中都能訪問(wèn)的變量。 ES6 變量作用域與提升:變量的生命周期詳解從屬于筆者的現(xiàn)代 JavaScript 開(kāi)發(fā):語(yǔ)法基礎(chǔ)與實(shí)踐技巧系列文章。本文詳細(xì)討論了 JavaScript 中作用域、執(zhí)行上下文、不同作用域下變量提升與函數(shù)提升的表現(xiàn)、頂層對(duì)象以及如何避免創(chuàng)建...

    lmxdawn 評(píng)論0 收藏0
  • JavaScript 變量聲明提升

    摘要:輸出的結(jié)果為輸出的結(jié)果為提升后輸出的結(jié)果為重新定義了變量輸出的結(jié)果為如果定義了相同的函數(shù)變量聲明,后定義的聲明會(huì)覆蓋掉先前的聲明,看如下代碼輸出練習(xí)的值是多少的值是多少第二題的解析請(qǐng)看這里參考資料文章文章中文版鏈接文章推薦文章變量提升 JavaScript 變量聲明提升 原文鏈接 一個(gè)小例子 先來(lái)看個(gè)例子: console.log(a); // undefined var a =...

    fireflow 評(píng)論0 收藏0
  • javascript聲明提升

    摘要:但是碰到聲明提升,這種想法就會(huì)被打破。聲明一個(gè)函數(shù)進(jìn)行相應(yīng)的操作,會(huì)得到函數(shù)聲明提升的結(jié)果。由此可以發(fā)現(xiàn)變量和函數(shù)的聲明都會(huì)被提升在其他代碼的前面執(zhí)行。一個(gè)普通塊內(nèi)部的函數(shù)聲明通常會(huì)被提升到所在的作用域的頂部。的創(chuàng)建初始化和賦值均會(huì)被提升。 Javascript聲明提升 在分析聲明提升之前,我認(rèn)為有必要知道的兩點(diǎn): 一、引擎查詢變量的兩種方式 引擎查詢變量的方式可以分為L(zhǎng)HS和RHS兩...

    evin2016 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<