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