javascript支持閉包(closure)的概念,Javascript里的閉包是一種特殊的對(duì)象,由函數(shù)和函數(shù)創(chuàng)建時(shí)所處的環(huán)境組成,環(huán)境里包括了閉包被創(chuàng)建時(shí)所在的作用域里的所有本地變量。
function makeFunc() { var name = "Mozilla"; function displayName() { alert(name); } return displayName;}var myFunc = makeFunc();myFunc();上例子中,myFunc就是閉包。
循環(huán)創(chuàng)建的閉包都關(guān)聯(lián)到相同的變量i, 在第一個(gè)print執(zhí)行時(shí),i已經(jīng)為10。
為了解決這個(gè)問題,一個(gè)方法是使用更多的閉包
for (var i = 0; i < 10; i++) { (function (i) { function print() { console.log(i); } setTimeout(print, 1000); }) (i);}for (var i = 0; i < 10; i++) { (function () { var ii = i; function print() { console.log(ii); } setTimeout(print, 1000); }) ();}for (var i = 0; i < 10; i++) { var print = (function () { var ii = i; return function print() { console.log(ii); } }) (); setTimeout(print, 1000);}//same output: 0 1 2 3 4 5 6 7 8 9上述不同的寫法都是利用更多的閉包來創(chuàng)建獨(dú)立的閉包環(huán)境,都有一樣的結(jié)果。
另一個(gè)方法時(shí)用ES6的let關(guān)鍵字聲明變量:
for (let i = 0; i < 10; i++) { function print() { console.log(i); } setTimeout(print, 1000);}//output: 0 1 2 3 4 5 6 7 8 9Javascript沒有類似Java這里面向?qū)ο笳Z(yǔ)言的方法訪問權(quán)限的功能,不過通過閉包,可以模擬出私有方法:
var counter = (function() { var privateCounter = 0; function changeBy(val) { privateCounter += val; } return { increment: function() { changeBy(1); }, decrement: function() { changeBy(-1); }, value: function() { return privateCounter; } }; })();console.log(counter.value()); // logs 0counter.increment();counter.increment();console.log(counter.value()); // logs 2counter.decrement();console.log(counter.value()); // logs 1counter.increment, counter.decrement, counter.value為公共的方法,共享同一個(gè)環(huán)境形成閉包,而counter內(nèi)部privateCounter和changeBy則被私有化,對(duì)外不可見。這種做法提供了代碼隱藏和封裝的一些益處。
更多MDN
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注