国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

Javascript閉包

2019-11-14 10:45:33
字體:
供稿:網(wǎng)友

概念

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)建閉包引發(fā)的錯(cuò)誤

for (var i = 0; i < 10; i++) { function PRint() { console.log(i); } setTimeout(print, 1000);}//output: 10 10 10 10 10 10 10 10 10 10

循環(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 9

模擬私有方法

Javascript沒有類似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 1

counter.increment, counter.decrement, counter.value為公共的方法,共享同一個(gè)環(huán)境形成閉包,而counter內(nèi)部privateCounter和changeBy則被私有化,對(duì)外不可見。這種做法提供了代碼隱藏和封裝的一些益處。

更多MDN


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 芦溪县| 来安县| 沅陵县| 天柱县| 孙吴县| 英吉沙县| 娱乐| 苍梧县| 黄浦区| 白玉县| 鹰潭市| 罗山县| 隆德县| 开封县| 麦盖提县| 五大连池市| 资中县| 湘西| 桦甸市| 柳河县| 乐安县| 上高县| 巢湖市| 蚌埠市| 泰州市| 顺平县| 大理市| 阳谷县| 浑源县| 同德县| 阿克| 同心县| 离岛区| 来安县| 上犹县| 佛冈县| 临武县| 永丰县| 元氏县| 西和县| 美姑县|