成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【闖關(guān)模式】作用域、鏈和閉包 中

airborne007 / 1683人閱讀

摘要:前言上篇闖關(guān)模式作用域鏈和閉包上任務(wù)三全局作用域和變量遮蔽全局作用域理解作用域鏈在哪結(jié)束很重要所有的運行時環(huán)境都必須隱式創(chuàng)建一個全局作用域?qū)ο鬄g覽器中是,中是,這個對象就位于作用域鏈的頂端在任務(wù)一中,我們忽略了一個細(xì)節(jié),即當(dāng)不使用或者等定義

前言

上篇:【闖關(guān)模式】作用域、鏈和閉包 上

任務(wù)三 Global Scope & Shadowing

全局作用域和變量遮蔽

全局作用域(Global Scope)

理解作用域鏈在哪結(jié)束很重要!
所有的JS運行時環(huán)境都必須隱式創(chuàng)建一個全局作用域?qū)ο螅g覽器中是window,node中是global),這個對象就位于作用域鏈的頂端:

    (global)
       ↑
       |
   someFunc()
       ↑
      / 
     /   
    /     
inner()  inner2()
           ↑
           |
         foo()

在任務(wù)一中,我們忽略了一個細(xì)節(jié),即當(dāng)不使用var或者let等定義變量的時候,這個變量就暴露給了外部作用域。

JS運行環(huán)境根據(jù)以下算法來賦值一個變量:

查找當(dāng)前作用域

如果沒找到,查找直接外部作用域

如果找到,至6

如果沒找到,重復(fù)2和3直到到達全局作用域

如果在全局作用域沒有找到,創(chuàng)建之(在windowglobal對象上)

賦值

這樣的話,在第5步就有可能意外創(chuàng)建一個全局變量了

全局作用域 栗子:

function someFunc() {
   var scopedVar = 1;
   function inner() {
      foo = 2;
   }
}

注意到foo的定義缺少了var或者let。
JS運行環(huán)境就會根據(jù)上面的算法,先查找inner(),然后是someFunc(),最好是全局作用域,第5步被執(zhí)行了,所以foo變成了全局變量(window.foo/global.foo)

換一種說法:當(dāng)你忘了寫var,本來在inner中定義的變量foo就可能被外部作用域修改,所以someFunc()這個作用域就有了本不該有的權(quán)限(訪問內(nèi)部變量foo

記好了:只有內(nèi)部作用域可以訪問外部作用域,在上面的例子中someFunc()是在全局作用域里面,所以才可以訪問foo

變量遮蔽(Shadowing)

在上面的算法中,變量的創(chuàng)建屬于其中的第0步:當(dāng)varlet被使用,變量就被綁定在了當(dāng)前作用域,然后任何該變量的賦值部分再繼續(xù)上面的算法。

在兩個不同作用域中定義兩個名字完全相同的變量也是可以的:

function someFunc() {
   var foo = 1;
}
function anotherFunc() {
   var foo = 2;
}

同樣在嵌套作用域中這樣做也可以:

function someFunc() {
   var foo = 1;
   function inner() {
      var foo = 2;
   }
}

這就叫變量遮蔽,inner()中的foo遮蔽(Shadow)住了someFunc中的foo

即:inner()作用域只能訪問自己的foo,無法再訪問定義在someFunc()中的foo

當(dāng)然,這種行為在深度嵌套或者巨型函數(shù)中也容易導(dǎo)致bug,需要多加注意!

你的任務(wù)

修改你之前的任務(wù)代碼,為foo()中的全局變量quux(不使用var或者let定義)賦一個值,在zip()中定義一個影子變量quux。同時這兩個變量的值不要相同。

完成后執(zhí)行:scope-chains-closures verify 驗證答案

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/79110.html

相關(guān)文章

  • 闖關(guān)模式作用、鏈和閉包

    摘要:前言上篇闖關(guān)模式作用域鏈和閉包中任務(wù)四閉包閉包在中是很重要的概念,他們讓出色地完成異步任務(wù)。所以說,作用域,作用域鏈,閉包,垃圾回收機制,他們都是息息相關(guān)的你的任務(wù)你需要用的來檢驗垃圾回收機制的運行。 前言 上篇 【闖關(guān)模式】作用域、鏈和閉包 中 任務(wù)四 閉包(Closures) 閉包在JS中是很重要的概念,他們讓JS出色地完成異步任務(wù)。 為了能更好的理解閉包,我們先來看作用域鏈的例子...

    firim 評論0 收藏0
  • 闖關(guān)模式作用鏈和閉包

    摘要:前言這個系列是翻譯自中的直接闖關(guān)作用域鏈和閉包作用域,作用域鏈,閉包和垃圾回收機制都有一個共同點學(xué)了就忘閉包到底是干啥的啥時候發(fā)生垃圾回收機制作用域鏈到底是啥這個教程讓你發(fā)現(xiàn)這些都是小意思。 前言 這個系列是翻譯自 nodeschool.io中的 scope-chains-closures 直接闖關(guān): npm install -g scope-chains-closures scope...

    shinezejian 評論0 收藏0
  • JavaScript 闖關(guān)

    摘要:對象數(shù)組初始化表達式,闖關(guān)記之上文檔對象模型是針對和文檔的一個。闖關(guān)記之?dāng)?shù)組數(shù)組是值的有序集合。數(shù)組是動態(tài)的,根闖關(guān)記之語法的語法大量借鑒了及其他類語言如和的語法。 《JavaScript 闖關(guān)記》之 DOM(下) Element 類型 除了 Document 類型之外,Element 類型就要算是 Web 編程中最常用的類型了。Element 類型用于表現(xiàn) XML 或 HTML 元素...

    mj 評論0 收藏0
  • 《JavaScript 闖關(guān)記》之作用閉包

    摘要:作用域和閉包是最重要的概念之一,想要進一步學(xué)習(xí),就必須理解作用域和閉包的工作原理。全局和局部作用域的關(guān)系在函數(shù)體內(nèi),局部變量的優(yōu)先級高于同名的全局變量。作用域鏈的用途,是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。 作用域和閉包是 JavaScript 最重要的概念之一,想要進一步學(xué)習(xí) JavaScript,就必須理解 JavaScript 作用域和閉包的工作原理。 作用域 任何...

    Jacendfeng 評論0 收藏0
  • 【進階2-1期】深入淺出圖解作用鏈和閉包

    摘要:本期推薦文章從作用域鏈談閉包,由于微信不能訪問外鏈,點擊閱讀原文就可以啦。推薦理由這是一篇譯文,深入淺出圖解作用域鏈,一步步深入介紹閉包。作用域鏈的頂端是全局對象,在全局環(huán)境中定義的變量就會綁定到全局對象中。 (關(guān)注福利,關(guān)注本公眾號回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實戰(zhàn)、面試指導(dǎo)) 本周開始前端進階的第二期,本周的主題是作用域閉包,今天是第6天。 本...

    levius 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<