摘要:原文原文原文詞法作用域作用域有兩種常見的模型,一種叫做詞法作用域,一種叫做動(dòng)態(tài)作用域。其中詞法作用域更常見,被大多數(shù)語(yǔ)言采用,包括。值得注意的是,一個(gè)函數(shù)作用域只有可能存在于一個(gè)父級(jí)作用域中,不會(huì)同時(shí)存在兩個(gè)父級(jí)作用域。
原文: 原文1 | 原文2
Lexical Scope - 詞法作用域
作用域有兩種常見的模型,一種叫做 詞法作用域 Lexical Scope,一種叫做動(dòng)態(tài)作用域 Dynamic Scope。其中詞法作用域更常見,被大多數(shù)語(yǔ)言采用,包括javascript。
詞法分析詞法分析過(guò)程Lex-time,是指系統(tǒng)講源碼字符串解讀成有含義的token的過(guò)程。詞法作用域就是說(shuō)在詞法分析過(guò)程中指派的作用域,詞法作用域在詞法解析過(guò)程中就已經(jīng)定死了。
依然有一些手段能在詞法解析之后改變?cè)~法作用域,但這些做法并不推薦。使用關(guān)鍵詞eval, with,會(huì)產(chǎn)生性能問題。
考慮如下代碼:
氣泡(作用域) 1 :即全局作用域,包含變量foo
氣泡(作用域) 2 :foo的作用域,包含變量a,bar,b
氣泡(作用域) 3 :bar的作用域,包含變量c
bar 作用域里完整的包含了foo 的作用域, 因?yàn)閎ar 是在foo中定義的,產(chǎn)生嵌套作用域。值得注意的是,一個(gè)函數(shù)作用域只有可能存在于一個(gè)父級(jí)作用域中,不會(huì)同時(shí)存在兩個(gè)父級(jí)作用域。
過(guò)程:
語(yǔ)句console.log尋找變量a,b,c 其中c在自己的作用域中找到,a,b在自己的作用域中找不到,于是向上級(jí)作用域中查找,在foo的作用域中找到,并且調(diào)用。作用域向上查找的過(guò)程中,匹配第一次查找到的變量,也就是說(shuō)如果foo的作用域中也定義了c,但bar函數(shù)只調(diào)用自己作用域里的c。
作用域的查找一直會(huì)找到全局作用域的全局對(duì)象,比如瀏覽器中的window,你可以定義window.a來(lái)確保變量a可以被獲取。
詞法作用域向上查找只查找第一級(jí)變量,比如變量foo.bar.baz, 查找的是對(duì)象foo,查找到了再?gòu)膶?duì)象里獲取bar以及baz,查找本身與bar,baz無(wú)關(guān)。
動(dòng)態(tài)作用域 Dynamic Scope動(dòng)態(tài)作用域,javascript并無(wú)采用,但是與js的 this機(jī)制非常相似,看如下代碼:
動(dòng)態(tài)作用域是在代碼運(yùn)行時(shí)定義的,而非代碼解析時(shí)。
function foo() { console.log( a ); } function bar() { var a = 3; foo(); } var a = 2; bar();
bar調(diào)用,bar里面foo被調(diào)用,foo函數(shù)需要查找變量a,由于javascript采用詞法作用域,foo被解析的時(shí)候是在全局作用域,所以a是全局作用域中的2,而非bar里面的a。假設(shè)js采用的是動(dòng)態(tài)作用域,foo是在bar中被調(diào)用的,所以a查找到了bar作用域里的3。
作為對(duì)照,動(dòng)態(tài)作用域不關(guān)心它本身是怎樣在哪里聲明的,只關(guān)心它在哪里調(diào)用的,動(dòng)態(tài)作用域的域鏈基于調(diào)用棧,而不是代碼中的嵌套關(guān)系。
相反,詞法作用域關(guān)心的是函數(shù)在哪里聲明的,動(dòng)態(tài)作用域的概念和js中的this相同,this也關(guān)心函數(shù)在哪里調(diào)用的。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/85510.html
摘要:編譯器對(duì)賦值的操作當(dāng)編譯器遇到它會(huì)詢問域是否存在變量,如果存在編譯器忽略這個(gè)聲明,如果不存在編譯器要求域聲明一個(gè)新變量給自己。兩種引用引用和引用,對(duì)于編譯器來(lái)說(shuō),指變量用于賦值,是指變量用于取值。里面的也是引用,因?yàn)樗糜讷@取的值。 You-Dont-Know-JS是github上一個(gè)擁有9000多枚星星的JS教學(xué)文檔,評(píng)價(jià)很高,為了避免和其他翻譯文一樣,容易陷入不宜讀的混亂,也試圖避...
摘要:完美的閉包,對(duì),閉包就這么簡(jiǎn)單。這僅僅是閉包的一部分,閉包利用函數(shù)作用域達(dá)到了訪問外層變量的目的。此時(shí)一個(gè)完整的閉包實(shí)現(xiàn)了,的垃圾回收機(jī)制由于閉包的存在無(wú)法銷毀變量。 1.閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù)。 上面這段話來(lái)自 javascript 高級(jí)程序設(shè)計(jì) 第三版 P178 。作者說(shuō)閉包是一個(gè)函數(shù),它有訪問另一個(gè)函數(shù)作用域中的變量的能力。 2.函數(shù)訪問它被創(chuàng)建時(shí)所處的...
摘要:因?yàn)橛脩舨挥迷诘谝淮芜M(jìn)入應(yīng)用時(shí)下載所有代碼,用戶能更快的看到頁(yè)面并與之交互。譯高階函數(shù)利用和來(lái)編寫更易維護(hù)的代碼高階函數(shù)可以幫助你增強(qiáng)你的,讓你的代碼更具有聲明性。知道什么時(shí)候和怎樣使用高階函數(shù)是至關(guān)重要的。 Vue 折騰記 - (10) 給axios做個(gè)挺靠譜的封裝(報(bào)錯(cuò),鑒權(quán),跳轉(zhuǎn),攔截,提示) 稍微改改都能直接拿來(lái)用~~~喲吼吼,喲吼吼..... 如何無(wú)痛降低 if else 面...
摘要:作用域有兩種主要工作模型詞法作用域和動(dòng)態(tài)作用域。可能會(huì)有一些同學(xué)認(rèn)為是,那就是沒有搞清楚詞法作用域的概念。在嚴(yán)格模式下,在運(yùn)行時(shí)有自己的詞法作用域,意味著其中的聲明無(wú)法修改所在的作用域。 1. 兩種作用域 作用域我們知道是一套規(guī)則,用來(lái)管理引擎如何在當(dāng)前作用域以及嵌套的子作用域中根據(jù)標(biāo)識(shí)符名稱進(jìn)行變量查找。 作用域有兩種主要工作模型:詞法作用域和動(dòng)態(tài)作用域。 大多數(shù)語(yǔ)言采用的都是詞法作...
摘要:寫在前面對(duì)于一個(gè)前端開發(fā)者,應(yīng)該沒有不知道作用域的。欺騙詞法作用域有兩個(gè)機(jī)制可以欺騙詞法作用域和。關(guān)于你不知道的的第一部分作用域和閉包已經(jīng)結(jié)束了,但是,更新不會(huì)就此止住未完待續(xù) 這是《你不知道的JavaScript》的第一部分。 本系列持續(xù)更新中,Github 地址請(qǐng)查閱這里。 寫在前面 對(duì)于一個(gè)前端開發(fā)者,應(yīng)該沒有不知道作用域的。它是一個(gè)既簡(jiǎn)單有復(fù)雜的概念,簡(jiǎn)單到每行代碼都有它的影子...
閱讀 2571·2021-11-22 09:34
閱讀 932·2021-11-19 11:34
閱讀 2801·2021-10-14 09:42
閱讀 1472·2021-09-22 15:27
閱讀 2385·2021-09-07 09:59
閱讀 1731·2021-08-27 13:13
閱讀 3432·2019-08-30 11:21
閱讀 771·2019-08-29 18:35