JS閉包方案

Mondo 科技 更新 2024-01-30

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 個變數:thisarguments、fun1(呼叫它的物件,也稱為活動物件),即視窗全球範圍本地範圍最大的區別是區域性作用域是在函式內部定義的,在非閉包的情況下,函式在完成時被釋放。 所以:

console.log('1',this.name);實際上,它正在看窗戶name屬性,這個絕對是window因為在函式之前,我們決定var namewindow.name

至於fun1name實際上,在函式中,它根本沒有使用,如果我們不明確指定它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 的是視窗。

相關問題答案

    JS Puzzle Object 中的鍵是有序的嗎?

    當我們使用 for in 遍歷物件時,列印結果是否按鍵的順序列印?答案是 不一定 最近,當我在做乙個專案時,我遇到了乙個要求,即下拉列表中有 個固定選項,包括 全部 正常 無效。因此,我定義了乙個物件,遍歷它,並將結果放入以上 var obj 所以有今天的文章,見下文。物件鍵的排序規則到底是什麼樣子...