JS 中的閉包概念和閉包的範圍是全域性的。 我簡單談談我自己的實戰感受。
閉包是可以訪問另乙個函式作用域中的變數的函式。
建立閉包的一種常見方法是在另乙個函式中建立另乙個函式。
概念引自:下面是乙個示例來說明此概念:j**ascript 高階程式設計(第 3 版)。
中等7.2 閉合
乙個部分,178 頁
var name = 'window';function outerfun();return innerfun;};outerfun() (結果:1 個視窗 2 個 night3 視窗。示例**執行時,可以按如下方式分解:
var name = 'window';var fun1 = outerfun();var fun2 = fun1();fun2 是閉包 fun2();樂趣1最終通話讓我們繼續處理:
window.name = 'window';window.fun1 = window.outerfun();window.fun2 = window.fun1();fun2 是關閉視窗fun2();最終通話為什麼會變形?因為在最外層,所有變數實際上都是視窗物件!
經過上述細分,我們知道了最終的判斷fun2()
實際上,fun2 函式等同於視窗環境。
因此,我們知道任何閉包最終都是在視窗環境中執行的,這就是為什麼閉包的範圍是全域性的。
讓我們看一下如何單獨拆分每個函式
var name = 'window';function fun1()為什麼
fun1
結果是:窗戶而不是夜晚?
知識:我們知道,當任何函式被執行時,它都會先為它建立乙個上下文,然後初始化 2 個變數:this
跟arguments
、fun1(呼叫它的物件,也稱為活動物件),即視窗全球範圍
跟本地範圍
最大的區別是區域性作用域是在函式內部定義的,在非閉包的情況下,函式在完成時被釋放。 所以:
console.log('1',this.name);
實際上,它正在看窗戶name
屬性,這個絕對是window
因為在函式之前,我們決定var name
window.name
至於fun1
name
實際上,在函式中,它根本沒有使用,如果我們不明確指定它this.name
,即:
var name = 'window';function fun1()那麼結果肯定是:night,如果 fun1 內部沒有定義名稱,那麼全域性名稱最終將通過原型鏈(或上下文)找到。
function fun2()fun2 實際上有 3 個活動:
自函式:fun1 函式、window 函式console.log('2',name);
將優先考慮從內部看name
變數,未找到!然後從為其提供閉包的父函式開始fun1
發現,找到,即:夜晚
console.log('3',this.name);
這裡明確規定this.name
然後,系統將開始尋找原型鏈this.name
由於this
指向window
,則結果為:視窗
事實上,閉合功能在我們的日常工作中經常使用。
通過文字定義物件 objvar obj = );
3s後顯示:hello nightfunction delaydisplay(),3000);}實際上,這方面的例子還有很多,但無論如何,你必須記住乙個概念:函式中的函式。 閉包的優點是可以訪問建立閉包物件的變數。
fun2 中的這不應該指向 fun1 嗎?這如何直接指向最外層的視窗
這表明你並不完全理解閉包,要理解它指向誰,主要是看看誰執行了當前函式,所以這指向了函式中的誰。 在本例中,fun1 的目的是返回 fun2 函式,但實際執行 fun2 的是視窗。