摘要:作用域首先分為兩個部分全局作用域和局部作用域。局部作用域在函數內部聲明的變量和函數保存在函數的局部作用域中。作用域鏈作用域鏈是因為函數發生了嵌套,當一個函數嵌套在另一個函數內就發生了作用域的嵌套。
1.作用域
比較復雜的說法是根據名稱來查找變量的一套規則,還有的說法是變量數據的集合。作用域其實是指一個包含了所有在同一個區域聲明的變量和函數的集合,那么如何決定這些變量數據和函數是屬于同一區域的呢?這就由他們最初聲明時的位置來決定的。作用域首先分為兩個部分:全局作用域和局部作用域。
全局作用域:在代碼任何地方都可以訪問到的變量和函數保存在全局作用域中。
定義在全局的(最外層的)變量和函數:
這段代碼中,變量a和函數Foo定義在最外層,所以在代碼的任何地方都可以訪問到他們。
未聲明的變量,自動定義為全局變量:
變量a沒有聲明,但對它進行了賦值,這不是一個錯誤的操作,因為引擎會默認的將變量a聲明為全局變量。
局部作用域:在函數內部聲明的變量和函數保存在函數的局部作用域中。
變量a是全局變量,所以在函數bar的內部可以訪問到a,變量c定義在函數bar內部,所以c是存在在函數bar的局部作用域中。函數bar定義在函數Foo內部,所以在全局作用域中找不到這個函數,當試圖去訪問它時,會有ReferenceError。變量b同理也無法在外部作用域中被訪問。
這段代碼中,console.log(a+b+c)輸出9,函數bar內部只定義了變量c,但是他卻可以訪問到外部的變量a和b,這就引出了下面所要討論的作用域鏈。
2.作用域鏈
作用域鏈是因為函數發生了嵌套,當一個函數嵌套在另一個函數內就發生了作用域的嵌套。當一個函數要查找變量時,它會從自已的作用域開始查找,如果找不到就向上一級,找嵌套自己的父級作用域,這樣一級一級的查找,知道找到為止,或者到最外層作用域(全局作用域)。
函數bar需要訪問三個變量:a、b、c,首先會查找自己的局部作用域,只找到了聲明在內部的變量c,所以向上一級查找,就到了嵌套它的函數,也就是他的父級Foo函數的局部作用域,在Foo的局部作用域中找到了需要的變量a和b。這里注意一下,全局作用域中也有一個相同命名的變量a,但是當查找到需要的變量時,搜索就會停止,不會再進行下去,所以全局作用域中a不會被搜索。
參考資料:
1.YOU DON"T KNOW JS ,KYLE SIMPSON
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/87068.html
摘要:函數高級作用域與作用域鏈一作用域作用域個數定義的函數個數全局作用域理解就是一塊地盤一個代碼段所在的區域。函數執行上下文環境是在調用函數時函數體代碼執行之前創建。 JavaScript函數高級——作用域與作用域鏈 一、作用域 作用域個數 = n(定義的函數個數) + 1(全局作用域)(1)理解 就是一塊地盤, 一個代碼段所在的區域。 它是靜態的(相對于上下文對象), 在編寫代碼時就確定...
摘要:一作用域域表示的就是范圍,即作用域,就是一個名字在什么地方可以使用,什么時候不能使用。概括的說作用域就是一套設計良好的規則來存儲變量,并且之后可以方便地找到這些變量。 一、作用域 域表示的就是范圍,即作用域,就是一個名字在什么地方可以使用,什么時候不能使用。想了解更多關于作用域的問題推薦閱讀《你不知道的JavaScript上卷》第一章(或第一部分),從編譯原理的角度說明什么是作用域。概...
摘要:的變量作用域是基于其特有的作用域鏈的。需要注意的是,用創建的函數,其作用域指向全局作用域。所以,有另一種說法認為閉包是由函數和與其相關的引用環境組合而成的實體。 作用域 定義 在編程語言中,作用域控制著變量與參數的可見性及生命周期,它能減少名稱沖突,而且提供了自動內存管理 --javascript 語言精粹 我理解的是,一個變量、函數或者成員可以在代碼中訪問到的范圍。 js的變量作...
摘要:所以上面那段代碼鏈中最初應該是之后之后所以最后的輸出結果是作用域鏈概念看了前面一個完整的函數執行過程,讓我們來說下作用域鏈的概念吧。而這一條形成的鏈就是中的作用域鏈。 showImg(https://segmentfault.com/img/bVbvayE?w=1280&h=545); 1. 什么是作用域 作用域是你的代碼在運行時,某些特定部分中的變量,函數和對象的可訪問性。換句話說,...
閱讀 1756·2023-04-25 16:28
閱讀 691·2021-11-23 09:51
閱讀 1475·2019-08-30 15:54
閱讀 1159·2019-08-30 15:53
閱讀 2827·2019-08-30 15:53
閱讀 3422·2019-08-30 15:43
閱讀 3263·2019-08-30 11:18
閱讀 3281·2019-08-26 10:25