成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

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

airborne007 / 1725人閱讀

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

前言

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

任務(wù)三 Global Scope & Shadowing

全局作用域和變量遮蔽

全局作用域(Global Scope)

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

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

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

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

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

如果沒(méi)找到,查找直接外部作用域

如果找到,至6

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

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

賦值

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

全局作用域 栗子:

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

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

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

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

變量遮蔽(Shadowing)

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

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

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()作用域只能訪問(wèn)自己的foo,無(wú)法再訪問(wèn)定義在someFunc()中的foo

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

你的任務(wù)

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

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

    Jacendfeng 評(píng)論0 收藏0
  • 【進(jìn)階2-1期】深入淺出圖解作用鏈和閉包

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

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

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

0條評(píng)論

閱讀需要支付1元查看
<