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