国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

理解 Javascript 中變量的作用域

Rocture / 1879人閱讀

摘要:在中,沒有塊級(jí)作用域一說在或者等語言中,等語句塊內(nèi)可以包含自己的局部變量,這些變量的作用域是這些語句的語句塊,而在中,不存在塊級(jí)作用域的說法。作用域鏈如果要深入理解中變量的作用域,那就必須拿出作用域鏈這個(gè)終極武器。

Javascript 這門語言與其他的大部分語言相比,有很多特殊性,這是很多人喜歡它或者討厭它的原因。其中變量的作用域問題,對(duì)很多初學(xué)者來說就是一個(gè)又一個(gè)「坑」。

變量的作用域在編程技能中算是一個(gè)基本概念,而在 Javascript 中,這一基本概念往往挑戰(zhàn)者初學(xué)者的常識(shí)。

基本的變量作用域

先上例子:

javascriptvar scope = "global";
function checkScope(){
    var scope = "local";
    console.log(scope); // local
}
checkScope();
console.log(scope); // global

上面的例子中,聲明了全局變量 scope 和函數(shù)體內(nèi)的局部變量 scope。在函數(shù)體內(nèi)部,局部變量的優(yōu)先級(jí)比通明的全局變量要高,如果一個(gè)局部變量的名字與一個(gè)全局變量相同,那么,在聲明局部變量的函數(shù)體范圍內(nèi),局部變量將覆蓋同名的全局變量。

下面再看一個(gè)例子:

javascriptscope = "global";
function checkScope(){
    scope = "local"; 
    console.log(scope); // local
    myScope = "local";
    console.log(myScope); // local
}
checkScope();
console.log(scope); // local
console.log(myScope); // local

對(duì)于初學(xué)者來說,可能會(huì)有兩個(gè)疑問:為什么在函數(shù)體外,scope 的值也變成了 local ?為什么在函數(shù)體外可以訪問 myScope 變量?

這兩個(gè)問題都源于一個(gè)特性。在全局作用域中聲明變量可以省略 var 關(guān)鍵字,但是如果在函數(shù)體內(nèi)聲明變量時(shí)不使用 var 關(guān)鍵字,就會(huì)發(fā)生上面的現(xiàn)象。首先,函數(shù)體內(nèi)的第一行語句,把全局變量中的 scope 變量的值改變了。而在聲明 myScope 變量時(shí),由于沒有使用 var 關(guān)鍵字,Javascript 就會(huì)在全局范圍內(nèi)聲明這個(gè)變量。因此,在聲明局部變量時(shí)使用 var 關(guān)鍵字是個(gè)很好的習(xí)慣。

在 Javascript 中,沒有「塊級(jí)作用域」一說

在 C 或者 Java 等語言中,iffor 等語句塊內(nèi)可以包含自己的局部變量,這些變量的作用域是這些語句的語句塊,而在 Javascript 中,不存在「塊級(jí)作用域」的說法。

看下面的例子:

javascriptfunction checkScope(obj){
    var i = 0;
    if (typeof obj == "object") {
        var j = 0;
        for (var k = 0; k < 10; k++) {
            console.log(k);
        }
        console.log(k);
    }
    console.log(j);
}
checkScope(new Object());

在上面的例子中,每一條控制臺(tái)輸出語句都能輸出正確的值,這是因?yàn)椋捎?Javascript 中不存在塊級(jí)作用域,因此,函數(shù)中聲明的所有變量,無論是在哪里聲明的,在整個(gè)函數(shù)中它們都是有定義的

如果要更加強(qiáng)調(diào)上文中 函數(shù)中聲明的所有變量,無論是在哪里聲明的,在整個(gè)函數(shù)中它們都是有定義的 這句話,那么還可以在后面跟一句話:函數(shù)中聲明的所有變量,無論是在哪里聲明的,在整個(gè)函數(shù)中它們都是有定義的,即使是在聲明之前。對(duì)于這句話,有個(gè)經(jīng)典的困擾初學(xué)者的「坑」。

javascriptvar a = 2;
function test(){
    console.log(a);
    var a = 10;
}
test();

上面的例子中,控制臺(tái)輸出變量 a 的值為 undefined,既不是全局變量 a 的值 2,也不是局部變量 a 的值 10。首先,局部變量在整個(gè)函數(shù)體內(nèi)都是有定義的,因此,局部變量 a 會(huì)在函數(shù)體內(nèi)覆蓋全局變量 a,而在函數(shù)體內(nèi),var 語句之前,它是不會(huì)被初始化的。如果要讀取一個(gè)未被初始化的變量,將會(huì)得到一個(gè)默認(rèn)值 undefined

所以,上面示例中的代碼與下面的代碼時(shí)等價(jià)的:

javascriptvar a = 2;
function test(){
    var a;
    console.log(a);
    a = 10;
}
test();

可見,把所有的函數(shù)聲明集合起來放在函數(shù)的開頭是個(gè)良好的習(xí)慣

變量的真相

可能很多人已經(jīng)注意到,在 Javascript 當(dāng)中,一個(gè)變量與一個(gè)對(duì)象的一個(gè)屬性,有很多相似的地方,實(shí)際上,它們并沒有什么本質(zhì)區(qū)別。在 Javascript 中,任何變量都是某個(gè)特定對(duì)象的屬性

全局變量都是全局對(duì)象的屬性。在 Javascript 解釋器開始運(yùn)行且沒有執(zhí)行 Javascript 代碼之前,會(huì)有一個(gè)「全局對(duì)象」被創(chuàng)建,然后 Javascript 解釋器會(huì)給它與定義一些屬性,這些屬性就是我們?cè)?Javascript 代碼中可以直接使用的內(nèi)置的變量和方法。之后,每當(dāng)我們定義一個(gè)全局變量,實(shí)際上是給全局對(duì)象定義了一個(gè)屬性。

在客戶端的 Javascript 當(dāng)中,這個(gè)全局變量就是 Window 對(duì)象,它有一個(gè)指向自己的屬性 window ,這就是我們常用的全局變量。

對(duì)于函數(shù)的局部變量,則是在函數(shù)開始執(zhí)行時(shí),會(huì)有一個(gè)對(duì)應(yīng)的「調(diào)用對(duì)象」被創(chuàng)建,函數(shù)的局部變量都作為它的屬性而存儲(chǔ)。這樣可以防止局部變量覆蓋全局變量。

作用域鏈

如果要深入理解 Javascript 中變量的作用域,那就必須拿出「作用域鏈」這個(gè)終極武器。

首先要理解的一個(gè)名詞就是「執(zhí)行環(huán)境」,每當(dāng) Javascript 執(zhí)行時(shí),都會(huì)有一個(gè)對(duì)應(yīng)的執(zhí)行環(huán)境被創(chuàng)建,這個(gè)執(zhí)行環(huán)境中很重要的一部分就是函數(shù)的調(diào)用對(duì)象(前面說過,調(diào)用對(duì)象是用來存儲(chǔ)相應(yīng)函數(shù)的局部變量的對(duì)象),每一個(gè) Javascript 方法都是在自己獨(dú)有的執(zhí)行環(huán)境中運(yùn)行的。簡(jiǎn)而言之,函數(shù)的執(zhí)行環(huán)境包含了調(diào)用對(duì)象,調(diào)用對(duì)象的屬性就是函數(shù)的局部變量,每個(gè)函數(shù)就是在這樣的執(zhí)行環(huán)境中執(zhí)行,而在函數(shù)之外的代碼,也在一個(gè)執(zhí)行環(huán)境中,這個(gè)執(zhí)行環(huán)境包含了全局變量。

在 Javascript 的執(zhí)行環(huán)境中,還有一個(gè)與之對(duì)應(yīng)的「作用域鏈」,它是一個(gè)由對(duì)象組成的列表或鏈。

當(dāng) Javascript 代碼需要查詢一個(gè)變量 x 的時(shí)候,會(huì)有一個(gè)被稱為「變量名解析」的過程。它會(huì)首先檢查作用域鏈的第一個(gè)對(duì)象,如果這個(gè)對(duì)象包含名為 x 的屬性,那么就采用這個(gè)屬性的值,否則,會(huì)繼續(xù)檢查第二個(gè)對(duì)象,依此類推。當(dāng)檢查到最后一個(gè)對(duì)象的時(shí)候仍然沒有相應(yīng)的屬性,則這個(gè)變量會(huì)被認(rèn)定為是「未定義」的。

在全局的 Javascript 執(zhí)行環(huán)境中,作用域鏈中只包含一個(gè)對(duì)象,就是全局對(duì)象。而在函數(shù)的執(zhí)行環(huán)境中,則同時(shí)包含函數(shù)的調(diào)用對(duì)象。由于 Javascript 的函數(shù)是可以嵌套的,因此每個(gè)函數(shù)執(zhí)行環(huán)境的作用域鏈可能包含不同數(shù)目個(gè)對(duì)象,一個(gè)非嵌套的函數(shù)的執(zhí)行環(huán)境中,作用域鏈包含了這個(gè)函數(shù)的調(diào)用對(duì)象和全局對(duì)象,而在嵌套的函數(shù)的執(zhí)行環(huán)境中,作用域鏈包含了嵌套的每一層函數(shù)的調(diào)用對(duì)象以及全局變量。

我們可以用一個(gè)圖來直觀地解釋作用域鏈和變量名解析的過程:

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/85791.html

相關(guān)文章

  • 深入理解JavaScript作用作用

    前言 JavaScript中有一個(gè)被稱為作用域(Scope)的特性。雖然對(duì)于許多新手開發(fā)者來說,作用域的概念并不是很容易理解,本文我會(huì)盡我所能用最簡(jiǎn)單的方式來解釋作用域和作用域鏈,希望大家有所收獲! 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客 作用域(Scope) 1.什么是作用域 作用域是在運(yùn)行時(shí)代碼中的某些特定部分中變量,函數(shù)和對(duì)象的可訪問性。換句話說,作用域決定了代碼區(qū)塊中變量和其他資源的可見...

    baiy 評(píng)論0 收藏0
  • 深入理解JavaScript作用作用

    前言 JavaScript中有一個(gè)被稱為作用域(Scope)的特性。雖然對(duì)于許多新手開發(fā)者來說,作用域的概念并不是很容易理解,本文我會(huì)盡我所能用最簡(jiǎn)單的方式來解釋作用域和作用域鏈,希望大家有所收獲! 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客 作用域(Scope) 1.什么是作用域 作用域是在運(yùn)行時(shí)代碼中的某些特定部分中變量,函數(shù)和對(duì)象的可訪問性。換句話說,作用域決定了代碼區(qū)塊中變量和其他資源的可見...

    ytwman 評(píng)論0 收藏0
  • 【譯】理解JavaScript作用

    摘要:作用域是代碼的不同部分在運(yùn)行期間的可見性。大多數(shù)開發(fā)者想當(dāng)然地理解作用域,但毫無疑問,有它自己的說明。變量可能是全局作用域的,或者是方法作用域的。總而言之,不要重復(fù)聲明變量,使用良好命名,盡力避免在聲明前調(diào)用和執(zhí)行任何東西。 原文鏈接:https://hackernoon.com/unders... 什么是作用域? 就像JavaScript中的其他東西一樣,作用域并無特別之處。盡管大多...

    betacat 評(píng)論0 收藏0
  • 理解JavaScript核心知識(shí)點(diǎn):作用

    摘要:也毫不例外,但在中作用域的特性與其他高級(jí)語言稍有不同,這是很多學(xué)習(xí)者久久難以理清的一個(gè)核心知識(shí)點(diǎn)。主要使用的是函數(shù)作用域。 關(guān)于作用域:About Scope 作用域是程序設(shè)計(jì)里的基礎(chǔ)特性,是作用域使得程序運(yùn)行時(shí)可以使用變量存儲(chǔ)值、記錄和改變程序的狀態(tài)。JavaScript 也毫不例外,但在 JavaScript 中作用域的特性與其他高級(jí)語言稍有不同,這是很多學(xué)習(xí)者久久難以理清的一個(gè)核...

    HelKyle 評(píng)論0 收藏0
  • 談?wù)?em>javascript語法里一些難點(diǎn)問題(二)

    摘要:講作用域鏈?zhǔn)紫纫獜淖饔糜蛑v起,下面是百度百科里對(duì)作用域的定義作用域在許多程序設(shè)計(jì)語言中非常重要。原文出處談?wù)務(wù)Z法里一些難點(diǎn)問題二 3) 作用域鏈相關(guān)的問題 作用域鏈?zhǔn)莏avascript語言里非常紅的概念,很多學(xué)習(xí)和使用javascript語言的程序員都知道作用域鏈?zhǔn)抢斫鈐avascript里很重要的一些概念的關(guān)鍵,這些概念包括this指針,閉包等等,它非常紅的另一個(gè)重要原因就...

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

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

0條評(píng)論

Rocture

|高級(jí)講師

TA的文章

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