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