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