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