摘要:前言上篇闖關(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)建之(在window或global對象上)
賦值
這樣的話,在第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)var或let被使用,變量就被綁定在了當(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)模式作用域鏈和閉包中任務(wù)四閉包閉包在中是很重要的概念,他們讓出色地完成異步任務(wù)。所以說,作用域,作用域鏈,閉包,垃圾回收機制,他們都是息息相關(guān)的你的任務(wù)你需要用的來檢驗垃圾回收機制的運行。 前言 上篇 【闖關(guān)模式】作用域、鏈和閉包 中 任務(wù)四 閉包(Closures) 閉包在JS中是很重要的概念,他們讓JS出色地完成異步任務(wù)。 為了能更好的理解閉包,我們先來看作用域鏈的例子...
摘要:前言這個系列是翻譯自中的直接闖關(guān)作用域鏈和閉包作用域,作用域鏈,閉包和垃圾回收機制都有一個共同點學(xué)了就忘閉包到底是干啥的啥時候發(fā)生垃圾回收機制作用域鏈到底是啥這個教程讓你發(fā)現(xiàn)這些都是小意思。 前言 這個系列是翻譯自 nodeschool.io中的 scope-chains-closures 直接闖關(guān): npm install -g scope-chains-closures scope...
摘要:對象數(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 元素...
摘要:作用域和閉包是最重要的概念之一,想要進一步學(xué)習(xí),就必須理解作用域和閉包的工作原理。全局和局部作用域的關(guān)系在函數(shù)體內(nèi),局部變量的優(yōu)先級高于同名的全局變量。作用域鏈的用途,是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。 作用域和閉包是 JavaScript 最重要的概念之一,想要進一步學(xué)習(xí) JavaScript,就必須理解 JavaScript 作用域和閉包的工作原理。 作用域 任何...
摘要:本期推薦文章從作用域鏈談閉包,由于微信不能訪問外鏈,點擊閱讀原文就可以啦。推薦理由這是一篇譯文,深入淺出圖解作用域鏈,一步步深入介紹閉包。作用域鏈的頂端是全局對象,在全局環(huán)境中定義的變量就會綁定到全局對象中。 (關(guān)注福利,關(guān)注本公眾號回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實戰(zhàn)、面試指導(dǎo)) 本周開始前端進階的第二期,本周的主題是作用域閉包,今天是第6天。 本...
閱讀 1837·2021-09-28 09:46
閱讀 3154·2019-08-30 14:22
閱讀 1887·2019-08-26 13:36
閱讀 3353·2019-08-26 11:32
閱讀 2102·2019-08-23 16:56
閱讀 1158·2019-08-23 16:09
閱讀 1311·2019-08-23 12:55
閱讀 2158·2019-08-23 11:44