摘要:前言上篇闖關模式作用域鏈和閉包上任務三全局作用域和變量遮蔽全局作用域理解作用域鏈在哪結束很重要所有的運行時環境都必須隱式創建一個全局作用域對象瀏覽器中是,中是,這個對象就位于作用域鏈的頂端在任務一中,我們忽略了一個細節,即當不使用或者等定義
前言
上篇:【闖關模式】作用域、鏈和閉包 上
任務三 Global Scope & Shadowing全局作用域和變量遮蔽
全局作用域(Global Scope)理解作用域鏈在哪結束很重要!
所有的JS運行時環境都必須隱式創建一個全局作用域對象(瀏覽器中是window,node中是global),這個對象就位于作用域鏈的頂端:
(global) ↑ | someFunc() ↑ / / / inner() inner2() ↑ | foo()
在任務一中,我們忽略了一個細節,即當不使用var或者let等定義變量的時候,這個變量就暴露給了外部作用域。
JS運行環境根據以下算法來賦值一個變量:
查找當前作用域
如果沒找到,查找直接外部作用域
如果找到,至6
如果沒找到,重復2和3直到到達全局作用域
如果在全局作用域沒有找到,創建之(在window或global對象上)
賦值
這樣的話,在第5步就有可能意外創建一個全局變量了
全局作用域 栗子:
function someFunc() { var scopedVar = 1; function inner() { foo = 2; } }
注意到foo的定義缺少了var或者let。
JS運行環境就會根據上面的算法,先查找inner(),然后是someFunc(),最好是全局作用域,第5步被執行了,所以foo變成了全局變量(window.foo/global.foo)
換一種說法:當你忘了寫var,本來在inner中定義的變量foo就可能被外部作用域修改,所以someFunc()這個作用域就有了本不該有的權限(訪問內部變量foo)
記好了:只有內部作用域可以訪問外部作用域,在上面的例子中someFunc()是在全局作用域里面,所以才可以訪問foo
變量遮蔽(Shadowing)在上面的算法中,變量的創建屬于其中的第0步:當var或let被使用,變量就被綁定在了當前作用域,然后任何該變量的賦值部分再繼續上面的算法。
在兩個不同作用域中定義兩個名字完全相同的變量也是可以的:
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
當然,這種行為在深度嵌套或者巨型函數中也容易導致bug,需要多加注意!
你的任務修改你之前的任務代碼,為foo()中的全局變量quux(不使用var或者let定義)賦一個值,在zip()中定義一個影子變量quux。同時這兩個變量的值不要相同。
完成后執行:scope-chains-closures verify
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/79110.html
摘要:前言上篇闖關模式作用域鏈和閉包中任務四閉包閉包在中是很重要的概念,他們讓出色地完成異步任務。所以說,作用域,作用域鏈,閉包,垃圾回收機制,他們都是息息相關的你的任務你需要用的來檢驗垃圾回收機制的運行。 前言 上篇 【闖關模式】作用域、鏈和閉包 中 任務四 閉包(Closures) 閉包在JS中是很重要的概念,他們讓JS出色地完成異步任務。 為了能更好的理解閉包,我們先來看作用域鏈的例子...
摘要:前言這個系列是翻譯自中的直接闖關作用域鏈和閉包作用域,作用域鏈,閉包和垃圾回收機制都有一個共同點學了就忘閉包到底是干啥的啥時候發生垃圾回收機制作用域鏈到底是啥這個教程讓你發現這些都是小意思。 前言 這個系列是翻譯自 nodeschool.io中的 scope-chains-closures 直接闖關: npm install -g scope-chains-closures scope...
摘要:對象數組初始化表達式,闖關記之上文檔對象模型是針對和文檔的一個。闖關記之數組數組是值的有序集合。數組是動態的,根闖關記之語法的語法大量借鑒了及其他類語言如和的語法。 《JavaScript 闖關記》之 DOM(下) Element 類型 除了 Document 類型之外,Element 類型就要算是 Web 編程中最常用的類型了。Element 類型用于表現 XML 或 HTML 元素...
摘要:作用域和閉包是最重要的概念之一,想要進一步學習,就必須理解作用域和閉包的工作原理。全局和局部作用域的關系在函數體內,局部變量的優先級高于同名的全局變量。作用域鏈的用途,是保證對執行環境有權訪問的所有變量和函數的有序訪問。 作用域和閉包是 JavaScript 最重要的概念之一,想要進一步學習 JavaScript,就必須理解 JavaScript 作用域和閉包的工作原理。 作用域 任何...
摘要:本期推薦文章從作用域鏈談閉包,由于微信不能訪問外鏈,點擊閱讀原文就可以啦。推薦理由這是一篇譯文,深入淺出圖解作用域鏈,一步步深入介紹閉包。作用域鏈的頂端是全局對象,在全局環境中定義的變量就會綁定到全局對象中。 (關注福利,關注本公眾號回復[資料]領取優質前端視頻,包括Vue、React、Node源碼和實戰、面試指導) 本周開始前端進階的第二期,本周的主題是作用域閉包,今天是第6天。 本...
閱讀 1829·2021-09-28 09:46
閱讀 3150·2019-08-30 14:22
閱讀 1881·2019-08-26 13:36
閱讀 3348·2019-08-26 11:32
閱讀 2097·2019-08-23 16:56
閱讀 1154·2019-08-23 16:09
閱讀 1307·2019-08-23 12:55
閱讀 2153·2019-08-23 11:44