摘要:函數(shù)高級(jí)作用域與作用域鏈一作用域作用域個(gè)數(shù)定義的函數(shù)個(gè)數(shù)全局作用域理解就是一塊地盤(pán)一個(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)理解
就是一塊"地盤(pán)", 一個(gè)代碼段所在的區(qū)域。
它是靜態(tài)的(相對(duì)于上下文對(duì)象), 在編寫(xiě)代碼時(shí)就確定了。
(2)分類(lèi)
全局作用域
函數(shù)作用域
ES6中新增了塊級(jí)作用域
(3)作用
隔離變量,不同作用域下同名變量不會(huì)有沖突。
二、作用域與執(zhí)行上下文(1)區(qū)別1
全局作用域之外,每個(gè)函數(shù)都會(huì)創(chuàng)建自己的作用域,作用域在函數(shù)定義時(shí)就已經(jīng)確定了。而不是在函數(shù)調(diào)用時(shí)。
全局執(zhí)行上下文環(huán)境是在全局作用域確定之后, js代碼馬上執(zhí)行之前創(chuàng)建。
函數(shù)執(zhí)行上下文環(huán)境是在調(diào)用函數(shù)時(shí), 函數(shù)體代碼執(zhí)行之前創(chuàng)建。
(2)區(qū)別2
作用域是靜態(tài)的, 只要函數(shù)定義好了就一直存在, 且不會(huì)再變化。
上下文環(huán)境是動(dòng)態(tài)的, 調(diào)用函數(shù)時(shí)創(chuàng)建, 函數(shù)調(diào)用結(jié)束時(shí)上下文環(huán)境就會(huì)被釋放。
(3)聯(lián)系
上下文環(huán)境(對(duì)象)是從屬于所在的作用域。
全局上下文環(huán)境==>全局作用域
函數(shù)上下文環(huán)境==>對(duì)應(yīng)的函數(shù)作用域
三、作用域鏈(1)理解
多個(gè)上下級(jí)關(guān)系的作用域形成的鏈, 它的方向是從下向上的(從內(nèi)到外)
查找變量時(shí)就是沿著作用域鏈來(lái)查找的。
(2)查找一個(gè)變量的查找規(guī)則
1)在當(dāng)前作用域下的執(zhí)行上下文中查找對(duì)應(yīng)的屬性, 如果有直接返回, 否則進(jìn)入2)。
2)在上一級(jí)作用域的執(zhí)行上下文中查找對(duì)應(yīng)的屬性, 如果有直接返回, 否則進(jìn)入3)。
3)再次執(zhí)行2)的相同操作, 直到全局作用域, 如果還找不到就拋出找不到的異常。
var a = 2; function fn1() { var b = 3; function fn2() { var c = 4; console.log(c); console.log(b); console.log(a); console.log(d); } fn2(); } fn1();四、作用域_面試題
面試題1
var x = 10; function fn() { console.log(x); } function show(f) { var x = 20; f(); } show(fn); // 結(jié)果 10 // 由于fn()的作用域中沒(méi)有找到屬性x,則會(huì)去fn()的上一級(jí)作用域也就是全局作用域中找,找到x=10,因此打印10.
面試題2
var fn = function () { console.log(fn) } fn() var obj = { fn2: function () { console.log(fn2) } } obj.fn2()
上面第一個(gè)會(huì)正常打印出fn()
第二個(gè),調(diào)用時(shí)是obj.fn2(),而obj.fn2() = function(){console.log(fn2)}
所以相當(dāng)于window調(diào)用function(){console.log(window.fn2)},而window中沒(méi)有fn2屬性,所以會(huì)報(bào)錯(cuò)。
將代碼改變:
var fn = function () { console.log(fn) } fn() var obj = { fn2: function () { // console.log(fn2) console.log(this.fn2) } } obj.fn2()
obj.fn2()調(diào)用時(shí)this的指向?yàn)?b>obj,所以相當(dāng)于function(){console.log(obj.fn2)},obj中有fn2屬性,所以能成功執(zhí)行。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/105077.html
摘要:建筑的頂層代表全局作用域。實(shí)際的塊級(jí)作用域遠(yuǎn)不止如此塊級(jí)作用域函數(shù)作用域早期盛行的立即執(zhí)行函數(shù)就是為了形成塊級(jí)作用域,不污染全局。這便是閉包的特點(diǎn)吧經(jīng)典面試題下面的代碼輸出內(nèi)容答案?jìng)€(gè)如何處理能夠輸出閉包方式方式下一篇你不知道的筆記 下一篇:《你不知道的javascript》筆記_this 寫(xiě)在前面 這一系列的筆記是在《javascript高級(jí)程序設(shè)計(jì)》讀書(shū)筆記系列的升華版本,旨在將零碎...
摘要:一作用域域表示的就是范圍,即作用域,就是一個(gè)名字在什么地方可以使用,什么時(shí)候不能使用。概括的說(shuō)作用域就是一套設(shè)計(jì)良好的規(guī)則來(lái)存儲(chǔ)變量,并且之后可以方便地找到這些變量。 一、作用域 域表示的就是范圍,即作用域,就是一個(gè)名字在什么地方可以使用,什么時(shí)候不能使用。想了解更多關(guān)于作用域的問(wèn)題推薦閱讀《你不知道的JavaScript上卷》第一章(或第一部分),從編譯原理的角度說(shuō)明什么是作用域。概...
摘要:理解作用域高級(jí)程序設(shè)計(jì)中有說(shuō)到對(duì)象是在運(yùn)行時(shí)基于函數(shù)的執(zhí)行環(huán)境綁定的在全局函數(shù)中,等于,而當(dāng)函數(shù)被作為某個(gè)對(duì)象調(diào)用時(shí),等于那個(gè)對(duì)象。指向與匿名函數(shù)沒(méi)有關(guān)系如果函數(shù)獨(dú)立調(diào)用,那么該函數(shù)內(nèi)部的,則指向。 理解this作用域 《javascript高級(jí)程序設(shè)計(jì)》中有說(shuō)到: this對(duì)象是在運(yùn)行時(shí)基于函數(shù)的執(zhí)行環(huán)境綁定的:在全局函數(shù)中,this等于window,而當(dāng)函數(shù)被作為某個(gè)對(duì)象調(diào)用時(shí),t...
摘要:的變量作用域是基于其特有的作用域鏈的。需要注意的是,用創(chuàng)建的函數(shù),其作用域指向全局作用域。所以,有另一種說(shuō)法認(rèn)為閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實(shí)體。 作用域 定義 在編程語(yǔ)言中,作用域控制著變量與參數(shù)的可見(jiàn)性及生命周期,它能減少名稱(chēng)沖突,而且提供了自動(dòng)內(nèi)存管理 --javascript 語(yǔ)言精粹 我理解的是,一個(gè)變量、函數(shù)或者成員可以在代碼中訪問(wèn)到的范圍。 js的變量作...
摘要:所以上面那段代碼鏈中最初應(yīng)該是之后之后所以最后的輸出結(jié)果是作用域鏈概念看了前面一個(gè)完整的函數(shù)執(zhí)行過(guò)程,讓我們來(lái)說(shuō)下作用域鏈的概念吧。而這一條形成的鏈就是中的作用域鏈。 showImg(https://segmentfault.com/img/bVbvayE?w=1280&h=545); 1. 什么是作用域 作用域是你的代碼在運(yùn)行時(shí),某些特定部分中的變量,函數(shù)和對(duì)象的可訪問(wèn)性。換句話說(shuō),...
閱讀 1958·2021-11-22 09:34
閱讀 3209·2019-08-30 15:55
閱讀 773·2019-08-30 15:53
閱讀 2148·2019-08-30 15:52
閱讀 3075·2019-08-29 18:32
閱讀 2101·2019-08-29 17:15
閱讀 2478·2019-08-29 13:14
閱讀 3646·2019-08-28 18:05