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

首頁 > 編程 > JavaScript > 正文

淺談javascript中的閉包

2019-11-20 12:29:56
字體:
來源:轉載
供稿:網友

很長一段時間不理解閉包,后來了解了作用域,以及this相關問題才理解了閉包相關知識。
閉包(closure),也是面試題常客。簡單點來說就是函數嵌套函數。

函數作為返回值:

function foo () {  var a = 1;  return function () {   a++;   console.log(a);  }}var aaa = foo();aaa(); //2aaa(); //3

其實這個代碼不難理解,aaa是指向foo()返回的一個新函數,但是在這個函數里面引用了a變量,所以當執行完foo函數時,變量a還存在內存中不釋放。即a分別為2和3。

函數作為參數:

var a = 10;function foo () {console.log(a);}function aaa(fn) { var a = 100; fn();}aaa(foo);

按照我以前的理解,當執行在aaa函數里面執行fn函數,那么如果自身沒有a變量,就去父級作用域找a變量,此處是100,那結果是100嗎?

可惜答案不是,在這里結果是10,王福朋老師的博客講的比較好,他說要去創建這個函數的作用域取值,而不是“父作用域”。

閉包的使用場景

因為本人還比較菜鳥,在這里取一個簡單例子。當點擊li的時候彈出li在ul中所處的位置即索引值。

html代碼:

<ul>  <li>001</li>  <li>002</li>  <li>003</li></ul>

js代碼:

示例 1:
請看下面的代碼,運行后發現,無論點擊那個li,結果都是3了。

var aLi = document.getElementsByTagName('li');for (var i = 0; i<aLi.length; i++) {  aLi[i].onclick = function() {   alert(i);  }}

因為在匿名函數里面并沒有i變量,所以當for結束后,我們再去點擊頁面的li標簽,此時i早就是3了。

示例 2:

aLi[i].onclick = (function(i){    return function(){      alert(i);    }  })(i);

這次的做法是把函數當返回值,通過自執行函數的參數,把變量i傳進去,然后因為返回函數要引用這個i變量,所以當for循環結束也不會釋放i變量。即在內存中保存了i變量的值。基于這樣的原理,很容易在低版本ie中造成內存泄露。

示例 3:

for (var i = 0; i<aLi.length; i++) {  (function(i){    aLi[i].onclick = function(){      alert(i);    }  })(i);}

這個原理和上面大同小異。

小米前端閉包面試題:

function repeat (func, times, wait) {} //這個函數能返回一個新函數,比如這樣用var repeatedFun = repeat(alert, 10, 5000)//調用這個 repeatedFun ("hellworld")//會alert十次 helloworld, 每次間隔5秒

我的答案:

function repeat (func, times, wait) {  return function(str) {    while (times >0) {      setTimeout(function(){        func(str);      },wait);      times--;    }  }}var repeatedFun = repeat(alert, 10, 100);repeatedFun ("hellworld");

以上所述就是本文的全部內容了,希望對大家學習javascript閉包能夠有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 五原县| 奉化市| 广灵县| 邢台县| 民丰县| 会泽县| 句容市| 嘉黎县| 黄平县| 布尔津县| 芜湖县| 衡水市| 深州市| 新竹市| 甘孜| 隆子县| 渭源县| 黄冈市| 儋州市| 鞍山市| 吉安市| 绥宁县| 西乌珠穆沁旗| 玉门市| 兴城市| 河池市| 肥乡县| 嘉定区| 元阳县| 建瓯市| 东安县| 三原县| 织金县| 民权县| 萨迦县| 霍林郭勒市| 仁布县| 南木林县| 怀宁县| 和平县| 昌黎县|