生活随笔
收集整理的這篇文章主要介紹了
第五章 作用域闭包
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
5.作用域閉包
5.1 啟示
function foo(){ ? ?var a = 2; ? ?function bar(){ ? ? ? ?console.log(a); }
? ?return bar;
}var baz = foo();baz(); // 2 閉包的效果// 函數bar在定義時的詞法作用域外被調用。閉包使得它可以繼續訪問定義時的詞法作用域。 閉包實際上只是一個標準--關于如何在函數作為值按需傳遞的此法環境中書寫代碼 ? 當函數可以記住并訪問所在的詞法作用域,即使函數是在當前詞法作用域之外執行,這時就產生了閉包。 ? 5.2 實質問題
無論使用何種方式對函數類型的值進行傳遞,當函數在別處調用時都可以觀察到閉包。 function foo(){ ? ?var a = 2; ? ?function baz(){ ? ? ?console.log(a); //2} ? ?bar(baz);
}function bar(fn){ ? ?fn(); //閉包
} 間接調用 var fn;?function foo(){ ? ?var a = 2;
? ?function baz(){ ? ? ? console.log(a);} ? ?fn = baz; //將baz分配給全局變量}function bar(){ ? ?fn();
}foo();bar();//2 5.3 I got it
在定時器、事假監聽器、Ajax請求、跨窗口通信、Web Woekers或者任何其他的異步(或同步)任務中,使用了回調函數就是在使用閉包。 ? IIFE var a = 2;(function IIFE(){ ? ?console.log(a);
})(); 嚴格來說,并
不是閉包。IIFE不是在它本身的詞法作用域以外執行的。a是通過普通的詞法作用域查找而非閉包發現的。
但它的確創建了閉包,并且也是最常用來創建可以封閉起來的閉包的工具。 ? 5.4 循環和閉包
for(var i =1; i<=5; i++){ ? ?setTimeout(function timer(){ ? ? ? ?console.log(i); },i*1000);} 輸出6. ?延遲函數的回調會在循環結束時才執行,即使第二個參數是0,所有的回調函數依然是在循環結束之后才會被執行。 ? 缺陷是:再循環過程中每個迭代都需要一個閉包作用域。要想得到想要的結果--每個一秒輸出一個數字(遞增1)--1~5 ? for(var i =1;i<=5;i++){ ? ?(function(){ ? ? var j = i;
? ? ? ?setTimeout(function timer(){ ? ? ? ? ? ?console.log(j); ? ?},j*1000); })();} 在迭代內使用IIFE會為每個迭代都生成一個新的作用域,使延遲函數的回調可以將新的作用域封閉在每個迭代內部,每個迭代中都會含有一個具有正確值的變量供我們訪問。
? 塊作用域 let:用來劫持塊作用域,并且在這個塊作用域中聲明一個變量。
for(let i = 1; i<=5; i++){ ? ?setTimeout(function(){ ? ? ? ?console.log(i);
},i*1000);
} !!!可以得到想要的效果 1,2,3,4,5 ? 塊作用域和閉包 ? 5.5 模塊
模塊模式需要具備兩個必備條件: 必須有外部的封閉函數,該函數必須至少被調用一次(每次調用都會創建一個新的模塊實例)。封閉函數必須返回至少一個內部函數,這樣內部函數才能在私有作用于中形成閉包,并且可以訪問或者修改 私有的狀態。一個從函數調用所返回的,只有數據屬性而沒有閉包函數的對象并不是真正的模塊。 ? ? 模塊有兩個主要特征: - 為創建內部作用域而調用了一個包裝函數
- 包裝函數的返回值必須至少包括一個對內部函數的引用,這樣就會創建涵蓋整個包裝函數內部作用域的閉包。
5.5.1 現代的模塊
大多數模塊依賴加載器/管理器本質上都是將這種模塊定義封裝進一個有好的API里。 5.5.2 ?未來的模塊
import可以將一個模塊中的一個或多個API導入到當前作用域中,并分別綁定在一個變量上。 moddle會將整個模塊的API導入并綁定在一個變量上。 export會將當前模塊的一個標識符(變量、函數)導出為公共API ? 模塊文件中的內容會被當做好型包含在作用域閉包中一樣來處理,和函數閉包模塊一樣 ?
null
轉載于:https://www.cnblogs.com/Natsume5233/p/6488826.html
總結
以上是生活随笔為你收集整理的第五章 作用域闭包的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。