摘要:詞法作用域定義與查找詞法作用域就是定義在詞法階段的作用域,簡單來說詞法作用域是由你在寫代碼時將變量和塊作用域寫在哪里來決定的,因此大部分情況下當詞法分析器處理代碼時會保持作用域不變此例中一共由三個逐級嵌套的作用域包含這整個全劇作用域,其中只
詞法作用域 定義與查找
詞法作用域就是定義在詞法階段的作用域,簡單來說詞法作用域是由你在寫代碼時將變量和塊作用域寫在哪里來決定的,因此大部分情況下當詞法分析器處理代碼時會保持作用域不變
function foo(a) { var b = a * 2; function bar(c) { console.log(a, b, c) } bar(b * 3) } foo(2) // 2, 4, 12
此例中一共由三個逐級嵌套的作用域:
包含這整個全劇作用域,其中只有一個標識符:foo
包含著foo所創建的作用域,其中有三個標識符:a、bar和b
包含著bar所創建的作用,其中只有一個標識符:c
作用域查找過程
當引擎執行console.log(a, b, c)聲明時,它首先會從最內層的bar()函數作用域開始查找,在這里找到了c
因為無法找到a和b,因此會到再上一層的foo()作用域去查找
作用域查找會在找到第一個匹配的標識符時停止
無論函數在哪里被調用,也無論它如何被調用,它的詞法作用域都只由函數被聲明時所處的位置決定
函數作用域指的是屬于這個函數的全部變量都可以在整個函數的范圍內使用及復用,包括嵌套的作用域,這種設計方案非常有用。
隱藏內部實現在軟件設計中,應該最小限度地暴露必要內容,而將其他內容都隱藏起來,這個原則在如何在如何選擇作用域來包含變量和函數也同樣適用,例如:
var b; function one(a) { b = a + another(a) console.log(b) } function another(a) { return a*2 } one(2) // 6
在這段代碼中,給予外部函數b和another訪問權限不僅沒有必要,而且可能會被以非預期的方式使用,因此更加合理的設計會將這些內容隱藏在one()內部,例如:
function one(a) { function another(a) { return a*2 } var b b = a + another(a) console.log(b) } one(2) //6
這樣設計b和another()都無法從外部被訪問,功能和最終效果都沒有受影響,但是設計上將具體內容私有畫
立即執行行數表達式通過前面的介紹已經知道,在任意代碼片段外部添加包裝函數,可以將內部變量和函數定義隱藏起來,外部作用域無法訪問包裝函數內部的任何內容。例如:
var a = 0 function ex() { var a = 1 console.log(a) // 1 } ex(); console.log(a)// 0
雖然這樣可以解決一部分問題,但是并不理想,會將ex這個變量污染全局作用域,并且需要調用才能運行其中的代碼,javascript提供了解決問題的方案:立即執行函數表達式(IIFE)
var a = 0; (function () { var a = 1 console.log(a) //1 })(); console.log(a) //0
此時就不會有函數名泄漏到全局作用域,并且會自動執行,同時外部的作用域也無法直接訪問立即執行函數內的變量
塊作用域事實上javascript在ES6之前并沒有塊作用域的概念,但是其他很多編程語言都支持塊作用域,ES6之前javascript循環:
for (var i=0; i<3; i++) { console.log(i) //0, 1, 2 } console.log(i) //3
雖然我們的代碼看起來i只會在for循環內部使用,但是很不幸,i會被泄漏到全局的作用域中,污染全局作用域,即使這并是我們本意,但是在ES6改變了現狀,引入了新的let關鍵字,提供了除var以外的另一種變量聲明方式,let可以將變量綁定到所在的任意作用域中,即為其聲明的變量隱式地劫持了所在的作用域
for (let i=0; i<3; i++) { console.log(i) //0, 1, 2 } console.log(i) // i is not defined
以上內容是個人的一點總結,如果有錯誤或不嚴謹的地方,歡迎批評指正,如果喜歡,歡迎點贊收藏
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/91869.html
摘要:所以的作用域是靜態作用域,也叫詞法作用域。總結是一門基于詞法作用域靜態作用域的語言,會沿著作用域鏈像氣泡一樣向外部尋找變量聲明。又是函數作用域的語言,在中,使用和關鍵字后,能讓變量處于塊作用域中,而且不存在聲明提升。 本文共 1700 字,讀完只需 7 分鐘 概述 變量,編程語言中我們用來模擬現實概念的工具,比方說,變量可以表示對象,數組,數字,字符。既然是工具,那么就用工具的適用范圍...
摘要:是詞法作用域工作模式。使用可以將變量綁定在所在的任意作用域中通常是內部,也就是說為其聲明的變量隱式的劫持了所在的塊級作用域。 作用域與閉包 如何用js創建10個button標簽,點擊每個按鈕時打印按鈕對應的序號? 看到上述問題,如果你能看出來這個問題實質上是考對作用域的理解,那么恭喜你,這篇文章你可以不用看了,說明你對作用域已經理解的很透徹了,但是如果你看不出來這是一道考作用域的題目,...
摘要:是詞法作用域工作模式。使用可以將變量綁定在所在的任意作用域中通常是內部,也就是說為其聲明的變量隱式的劫持了所在的塊級作用域。 作用域與閉包 如何用js創建10個button標簽,點擊每個按鈕時打印按鈕對應的序號? 看到上述問題,如果你能看出來這個問題實質上是考對作用域的理解,那么恭喜你,這篇文章你可以不用看了,說明你對作用域已經理解的很透徹了,但是如果你看不出來這是一道考作用域的題目,...
摘要:是詞法作用域工作模式。使用可以將變量綁定在所在的任意作用域中通常是內部,也就是說為其聲明的變量隱式的劫持了所在的塊級作用域。 作用域與閉包 如何用js創建10個button標簽,點擊每個按鈕時打印按鈕對應的序號? 看到上述問題,如果你能看出來這個問題實質上是考對作用域的理解,那么恭喜你,這篇文章你可以不用看了,說明你對作用域已經理解的很透徹了,但是如果你看不出來這是一道考作用域的題目,...
閱讀 712·2021-11-22 13:52
閱讀 1518·2021-09-27 13:36
閱讀 2818·2021-09-24 09:47
閱讀 2172·2021-09-22 15:48
閱讀 3600·2021-09-22 15:39
閱讀 1463·2019-08-30 12:43
閱讀 2918·2019-08-29 18:39
閱讀 3181·2019-08-29 12:51