欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一起來了解JavaScript的變量作用域

 更新時間:2022年03月15日 12:00:29   作者:跳探戈的小龍蝦  
這篇文章主要為大家詳細介紹了JavaScript變量作用域,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

1.變量作用域的分析

首先,我們先研究一下JavaScript的變量作用域,研究作用域,我們不按照常規(guī)的文章那樣解釋概念,而是先給一個小demo,吊一下大家的胃口

var a = 1;  
var b = 2;  
function pomp(){  
    alert(a);  
    alert(b);  
    b = 2;  
    alert(b);  
    var a = 3;  
    alert(a);  
}  
pomp();

如果你的答案是對的,那么你對JavaScript的作用域的理解已經(jīng)是中等偏上了,可能有一些復(fù)雜的作用域你沒有掌握,但是簡單的開發(fā)已經(jīng)沒有問題了;如果你不知道答案,那么下面我就以這個例子為引,介紹一下JavaScript的變量作用域問題。

首先,如果有編程基礎(chǔ)的同學(xué),一定知道對于任何的編程語言,都有局部變量和全局變量的概念:全局變量的作用范圍是全局的;而局部變量往往在一個部分被定義和使用,在這個部分之外,它的空間就會被回收,我們就無法再使用它。常見的局部變量出現(xiàn)的地方有:for循環(huán)、函數(shù)體、代碼塊。

這些“局部”里,局部變量的優(yōu)先級是大于全局變量的,這是什么意思呢?我們再用一個小demo來解釋一下:

var a = 1
function pomp() {
    var a = 2
    alert(a)
        }
pomp()
alert(a)

也就是說,我們在局部和全局都有一個變量a,那么在局部,腳本解釋器會優(yōu)先從最近的位置開始尋找,最近的位置,當然會有局部>大于全局的效果,于是第一個彈窗彈出的是2,第二個才是1。

介紹完了局部變量和全局變量,我們再回到最開始的那個demo的問題:

var a = 1;  
var b = 2;  
function pomp(){  
    alert(a);  
    alert(b);  
    b = 2;  
    alert(b);  
    var a = 3;  
    alert(a);  
}  
pomp();

顯然,這里的問題是,我們明明已經(jīng)給a聲明為全局變量,并同時給a賦值了,那為什么會打印a為undefined呢?這就是JavaScript的另一個特點,就是解釋器在一行一行解釋代碼之前,會給變量劃好它們的作用域:

最開始,a和b都被聲明并定義為全局變量,a有值1,b有值2;此時,我們定義了一個函數(shù)pomp(),在函數(shù)內(nèi)部,我們又創(chuàng)建了一個局部變量a,這時候,按照剛才的分析,此時離得最近的其實應(yīng)該是局部變量a,這就解釋了為什么第一次alert(a)不是彈出1,但是還是沒有解釋undefined。

undefined的原因是這樣的:在解釋器解釋代碼之前,按照其他編程語言的叫法,我們稱這個時期是預(yù)編譯時期,在預(yù)編譯時期,由于函數(shù)體內(nèi)也聲明和定義了變量a,于是自然地函數(shù)體內(nèi)的a被劃歸到了局部變量a,即我們可以認為已經(jīng)執(zhí)行了一句:var a,但是由于這是預(yù)編譯時期,并沒有執(zhí)行var a = 3,因此此時我們可以理解為,只是執(zhí)行了 var a,而a = 3是在后面才會執(zhí)行,因此這是undefined的原因。

最后針對第一開始的demo做一個圖片,幫助大家理解JavaScript變量作用域

并附帶一句總結(jié):

當使用var關(guān)鍵字時,在局部或者全局中的任何位置,當某個變量被聲明后,無論是之前的哪個地方,都可以使用這個變量,只是會顯示undefined。

2.var關(guān)鍵字

最初的JavaScript,只有var這個關(guān)鍵字,因此上面的作用域講解,說白了是針對的var關(guān)鍵字,那么對于var關(guān)鍵字,這里就不再多做贅述,而是給一個小demo理解一下:

alert(a)
var a = 3
alert(a)

不過避免一些朋友從這里才開始看起,我還是再復(fù)述一下:

var關(guān)鍵字聲明的變量,只要在局部/全局的任何一個地方被聲明,那么在其他的地方,即使沒有被聲明,由于在預(yù)編譯階段該變量已經(jīng)被聲明,于是它也是存在的,只是會顯示undefined,也就是未定義,而后當執(zhí)行到var a = 3,它被定義了一個值3。

順便簡單嘮一下變量的聲明與定義的區(qū)別

  • var a;這句話叫聲明變量a
  • a = 3;這句話叫定義變量a
  • var a = 3;這句話叫聲明變量a,并給a定義為3

講完了var,其實作用域的難點也基本上結(jié)束了,但是由于是一篇完整的文章,下面對兩種新的JavaScript變量聲明關(guān)鍵字進行介紹:let和const它們的作用域與var略有不同。

3.let和const關(guān)鍵字

首先,我們還是先來一個demo:

alert(a)
let a = 3
alert(a)

哎嘿,大家點擊之后,是不是啥也沒有啊,這可不是我在惡作劇,而是確實是什么也沒有,原因是,它報錯了(hahaha):

好家伙,同樣的寫法,為啥var不報錯,let就報錯了呢?(注意,這里用const是一樣的,const和let的作用域是相同的,也即用const一樣會報錯!)

原因是,大家苦var久矣,這個let關(guān)鍵字,就是更符合我們的思維邏輯的一種變量的聲明方式,在let的作用域中:

一個變量只會在它被聲明之后才可以使用,而不是像var一樣,在任何地方只要有聲明,那么在前面的地方也可以用!

最后,我們簡單介紹一下const,const在let的基礎(chǔ)上,多了一個唯一性的概念:

const變量一經(jīng)定義,就不能再修改它的值了,適合定義一些特定的常量,例如:

const pi = 3.14

const e = 2.7

const的作用域與let相同!

4.var、let和const的對比

一口氣看完了三個關(guān)鍵字,我們最后再簡單梳理一下吧,在梳理之前,先上一個demo:

 function demo() {
            for (var i = 1; i < 10; i++) {
                //
            }
            alert(i)
            for (let j = 1; j < 9; j++) {
                //
            }
            alert(j)
        }
        demo()

大家看到這里似乎又有點小疑惑,因為我們知道for循環(huán)是一個局部,那么局部的變量i和j,在for循環(huán)的外面,理應(yīng)不存在才對但是很顯然,我們?nèi)绻藢α藭l(fā)現(xiàn),彈窗彈出了一個10,也就是說i此時值仍然保留為10,而j確實和我們想的一樣,是不存在的,它也確實報錯了:

那為啥會出現(xiàn)這種情況呢?原因是var關(guān)鍵字聲明的局部變量,會在整個大的局部退出時,才會回收內(nèi)存,也就是說for循環(huán)雖然也是一個局部,但是這個局部是屬于function這個大局部,因此才會出現(xiàn)仍然存在i,但是let顯然又一次達到了我們的預(yù)期!

關(guān)鍵字作用域值的特點
var變量在局部/全局任何地方被聲明,在對應(yīng)的局部/全局的其他任何地方都可以直接使用(甚至在聲明之前使用),但是使用時若未定義,則出現(xiàn)undefined。可以反復(fù)修改
let變量只能在被聲明語句的后面才可以使用。可以反復(fù)修改
const變量只能在被聲明語句的后面才可以使用。不可修改

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!      

相關(guān)文章

  • js常用的繼承--組合式繼承

    js常用的繼承--組合式繼承

    本篇文章主要介紹了js常用的繼承--組合式繼承的相關(guān)知識,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • js如何刪除對象/數(shù)組中null、undefined、空對象及空數(shù)組實例代碼

    js如何刪除對象/數(shù)組中null、undefined、空對象及空數(shù)組實例代碼

    JS中數(shù)組是我們較為常用的一種數(shù)據(jù)結(jié)構(gòu),下面這篇文章主要給大家介紹了關(guān)于js如何刪除對象/數(shù)組中null、undefined、空對象及空數(shù)組的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • JavaSript中變量的作用域閉包的深入理解

    JavaSript中變量的作用域閉包的深入理解

    js中的變量都是公用的沒有靜態(tài)變量,下面為大家介紹下變量的作用域閉包,需要的朋友可以參考下
    2014-05-05
  • Axios設(shè)置token請求頭的三種方式

    Axios設(shè)置token請求頭的三種方式

    用戶登錄時,后端會返回一個token,并且保存到瀏覽器的localstorage中,可以根據(jù)localstorage中的token判斷用戶是否登錄,所以當發(fā)送請求時,都要攜帶token給后端進行判斷,本文給大家介紹了Axios設(shè)置token請求頭的三種方式,需要的朋友可以參考下
    2024-02-02
  • javascript String 對象

    javascript String 對象

    javascript數(shù)據(jù)庫操作方法包括字符串大小寫,字符串搜索,提取字符串等
    2008-04-04
  • js數(shù)組中如何隨機取出一個值

    js數(shù)組中如何隨機取出一個值

    這篇文章主要介紹了js數(shù)組中如何隨機取出一個值,需要的朋友可以參考下
    2014-06-06
  • JS實現(xiàn)iframe自適應(yīng)高度的方法示例

    JS實現(xiàn)iframe自適應(yīng)高度的方法示例

    這篇文章主要介紹了JS實現(xiàn)iframe自適應(yīng)高度的方法,結(jié)合實例形式分析了JS實現(xiàn)iframe高度自適應(yīng)的實現(xiàn)技巧,并給出了項目示例供大家參考,需要的朋友可以參考下
    2017-01-01
  • js彈窗返回值詳解(window.open方式)

    js彈窗返回值詳解(window.open方式)

    本篇文章主要介紹了js彈窗返回值(window.open方式)。需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • JS使用setInterval實現(xiàn)的簡單計時器功能示例

    JS使用setInterval實現(xiàn)的簡單計時器功能示例

    這篇文章主要介紹了JS使用setInterval實現(xiàn)的簡單計時器功能,涉及javascript基于setInterval的定時觸發(fā)與數(shù)值運算相關(guān)操作技巧,需要的朋友可以參考下
    2018-04-04
  • js簡單實現(xiàn)網(wǎng)頁換膚功能

    js簡單實現(xiàn)網(wǎng)頁換膚功能

    這篇文章主要為大家詳細介紹了js簡單實現(xiàn)網(wǎng)頁換膚功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04

最新評論