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

首頁 > 編程 > JavaScript > 正文

Javascript閉包

2019-11-14 09:58:48
字體:
來源:轉載
供稿:網友

概念

javascript支持閉包(closure)的概念,Javascript里的閉包是一種特殊的對象,由函數和函數創建時所處的環境組成,環境里包括了閉包被創建時所在的作用域里的所有本地變量。

function makeFunc() { var name = "Mozilla"; function displayName() { alert(name); } return displayName;}var myFunc = makeFunc();myFunc();

上例子中,myFunc就是閉包。

循環創建閉包引發的錯誤

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

循環創建的閉包都關聯到相同的變量i, 在第一個print執行時,i已經為10。

為了解決這個問題,一個方法是使用更多的閉包

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

上述不同的寫法都是利用更多的閉包來創建獨立的閉包環境,都有一樣的結果。

另一個方法時用ES6的let關鍵字聲明變量:

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這里面向對象語言的方法訪問權限的功能,不過通過閉包,可以模擬出私有方法:

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為公共的方法,共享同一個環境形成閉包,而counter內部privateCounter和changeBy則被私有化,對外不可見。這種做法提供了代碼隱藏和封裝的一些益處。

更多MDN


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 济南市| 昆山市| 新蔡县| 海淀区| 成安县| 瓦房店市| 云霄县| 上杭县| 通榆县| 舒城县| 丰顺县| 博罗县| 岑巩县| 会东县| 富平县| 萨嘎县| 鸡泽县| 旬邑县| 安陆市| 林甸县| 陵川县| 柯坪县| 汕尾市| 临夏市| 定安县| 灵石县| 郎溪县| 桐庐县| 会宁县| 巩义市| 安康市| 张北县| 彰武县| 大田县| 靖西县| 临沂市| 平乡县| 九龙县| 手机| 中方县| 白朗县|