摘要:前言這個(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-closuresscope-chains-closures
作用域鏈和閉包
作用域,作用域鏈,閉包和垃圾回收機(jī)制都有一個(gè)共同點(diǎn):學(xué)了就忘!
閉包到底是干啥的?
啥時(shí)候發(fā)生垃圾回收機(jī)制?
作用域鏈到底是啥?
這個(gè)教程讓你發(fā)現(xiàn)這些都是小意思。讓你在實(shí)踐中學(xué)習(xí)!
任務(wù)一 作用域作用域的主要類型是詞法作用域。
簡單來說是function創(chuàng)建的作用域。(ES6中的塊級作用域暫且不提)
變量的初始化取決于作用域的類型
詞法作用域var用來將變量定義在詞法作用域中(也就是function中)
function someFunc(){ var a; }
a就被函數(shù)someFunc框在了詞法作用域中
塊級作用域let和const用來將變量定義在塊級作用域中(也就是花括號(hào)中)
if(true){ let b; }
b就被if的花括號(hào)框在了塊級作用域中
你的任務(wù)在空白的js文件中新建一個(gè)函數(shù)foo,并包含一個(gè)詞法作用域中的變量bar
任務(wù)二 作用域鏈 作用域嵌套作用域是可以嵌套的,任務(wù)一中提到的詞法作用域和塊級作用域都可以嵌套其他作用域
(塊級作用域僅對ES6而言)
function someFunc(){ function inner(){ } }
inner就是嵌套在someFunc(詞法作用域)中的詞法作用域
if(true){ while(false){ } }
while就是嵌套在if(塊級作用域)中的塊級作用域
function someFunc(){ if(true){ } }
if就是嵌套在someFunc(詞法作用域)中的塊級作用域
作用域中的變量訪問所有的嵌套作用域都遵循以下規(guī)則:
內(nèi)部作用域有權(quán)訪問外部作用域,反之不成立。
栗子:
function someFunc(){ var outerVar = 1; function inner(){ var innerVar = 2; } }
inner有權(quán)訪問innerVar和outerVar,但是someFunc只能訪問到outerVar
多重嵌套作用域作用域是可以任意嵌套的,但是都要遵循上面的規(guī)則。
再附加一個(gè)規(guī)則:
兄弟作用域不可相互訪問
栗子:
function someFunc(){ function inner(){ } function inner2(){ } }
inner和inner2都是someFunc中的作用域,正如someFunc不能訪問inner們的作用域一樣,inner們之間也不能相互訪問。
作用域樹從上向下看這個(gè)嵌套作用域,就是棵樹!
看代碼:
function someFunc() { function inner() { } function inner2() { function foo() { } } }
看樹:
someFunc() | / / / ↓ ↓ inner() inner2() | ↓ foo()
要記住的是:inner作用域可以訪問外部作用域,但是反之不成立(foo()可以訪問inner2()中的變量,inner2()可以訪問someFunc()中的變量),這棵樹倒過來似乎更有意義,就成了鏈?。?/p> 作用域鏈
從最里面看到最外面就構(gòu)成了作用域鏈
someFunc() ↑ inner2() ↑ | foo()你的任務(wù)
修改任務(wù)一中的代碼,讓foo中包含一個(gè)函數(shù)zip,同時(shí)zip也包含一個(gè)變量quux
完成后執(zhí)行:scope-chains-closures verify
scope-chains-closures workshop
scope cheatsheet
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/79111.html
摘要:前言上篇闖關(guān)模式作用域鏈和閉包上任務(wù)三全局作用域和變量遮蔽全局作用域理解作用域鏈在哪結(jié)束很重要所有的運(yùn)行時(shí)環(huán)境都必須隱式創(chuàng)建一個(gè)全局作用域?qū)ο鬄g覽器中是,中是,這個(gè)對象就位于作用域鏈的頂端在任務(wù)一中,我們忽略了一個(gè)細(xì)節(jié),即當(dāng)不使用或者等定義 前言 上篇:【闖關(guān)模式】作用域、鏈和閉包 上 任務(wù)三 Global Scope & Shadowing 全局作用域和變量遮蔽 全局作用域(Glob...
摘要:前言上篇闖關(guān)模式作用域鏈和閉包中任務(wù)四閉包閉包在中是很重要的概念,他們讓出色地完成異步任務(wù)。所以說,作用域,作用域鏈,閉包,垃圾回收機(jī)制,他們都是息息相關(guān)的你的任務(wù)你需要用的來檢驗(yàn)垃圾回收機(jī)制的運(yùn)行。 前言 上篇 【闖關(guān)模式】作用域、鏈和閉包 中 任務(wù)四 閉包(Closures) 閉包在JS中是很重要的概念,他們讓JS出色地完成異步任務(wù)。 為了能更好的理解閉包,我們先來看作用域鏈的例子...
摘要:對象數(shù)組初始化表達(dá)式,闖關(guān)記之上文檔對象模型是針對和文檔的一個(gè)。闖關(guān)記之?dāng)?shù)組數(shù)組是值的有序集合。數(shù)組是動(dòng)態(tài)的,根闖關(guān)記之語法的語法大量借鑒了及其他類語言如和的語法。 《JavaScript 闖關(guān)記》之 DOM(下) Element 類型 除了 Document 類型之外,Element 類型就要算是 Web 編程中最常用的類型了。Element 類型用于表現(xiàn) XML 或 HTML 元素...
摘要:作用域和閉包是最重要的概念之一,想要進(jìn)一步學(xué)習(xí),就必須理解作用域和閉包的工作原理。全局和局部作用域的關(guān)系在函數(shù)體內(nèi),局部變量的優(yōu)先級高于同名的全局變量。作用域鏈的用途,是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。 作用域和閉包是 JavaScript 最重要的概念之一,想要進(jìn)一步學(xué)習(xí) JavaScript,就必須理解 JavaScript 作用域和閉包的工作原理。 作用域 任何...
摘要:本期推薦文章從作用域鏈談閉包,由于微信不能訪問外鏈,點(diǎn)擊閱讀原文就可以啦。推薦理由這是一篇譯文,深入淺出圖解作用域鏈,一步步深入介紹閉包。作用域鏈的頂端是全局對象,在全局環(huán)境中定義的變量就會(huì)綁定到全局對象中。 (關(guān)注福利,關(guān)注本公眾號(hào)回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實(shí)戰(zhàn)、面試指導(dǎo)) 本周開始前端進(jìn)階的第二期,本周的主題是作用域閉包,今天是第6天。 本...
閱讀 973·2021-11-24 10:42
閱讀 3522·2021-11-19 11:34
閱讀 2657·2021-09-29 09:35
閱讀 2542·2021-09-09 09:33
閱讀 688·2021-07-26 23:38
閱讀 2531·2019-08-30 10:48
閱讀 1398·2019-08-28 18:07
閱讀 433·2019-08-26 13:44