在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ HTML/ 淺談 javascript 中的閉包
淺談 JavaScript 之事件綁定
淺談 javascript 中字符串 String 與數(shù)組 Array
淺談 javascript 中基本包裝類型
淺談 JavaScript Math 和 Number 對(duì)象
淺談 Javascript 的靜態(tài)屬性和原型屬性
淺談 JavaScript 中定義變量時(shí)有無 var 聲明的區(qū)別
淺談 JavaScript Array 對(duì)象
淺談 JavaScript 函數(shù)參數(shù)的可修改性問題
淺談 javascript 中的 instanceof 和 typeof
淺談 JavaScript 中 Date (日期對(duì)象),Math 對(duì)象
淺談 Javascript 執(zhí)行順序
淺談 javascript 函數(shù)屬性和方法
淺談 JavaScript 中面向?qū)ο蠹夹g(shù)的模擬
淺談 javascript 的原型繼承
淺談 javascript 事件取消和阻止冒泡
根據(jù)一段代碼淺談 Javascript 閉包
淺談 Javascript 面向?qū)ο缶幊?/span>
淺談 javascript 六種數(shù)據(jù)類型以及特殊注意點(diǎn)
淺談 Javascript 變量作用域問題
淺談 javascript 函數(shù)內(nèi)部屬性
淺談 javascript 中自定義模版
淺談 JavaScript 字符集
淺談 javascript 面向?qū)ο缶幊?/span>
淺談 JavaScript 框架分類
淺談 JavaScript 中的 Math.atan() 方法的使用
淺談 Javascript 數(shù)組與字典
淺談 JavaScript 數(shù)據(jù)類型及轉(zhuǎn)換
淺談 javascript 的調(diào)試
淺談 Javascript 嵌套函數(shù)及閉包
淺談 javascript 回調(diào)函數(shù)
淺談 JavaScript Date 日期和時(shí)間對(duì)象
淺談 Javascript 中的 Function 與 Object
淺談 JavaScript 數(shù)據(jù)類型
淺談 javascript 中 this 在事件中的應(yīng)用
淺談 javascript 中的閉包
淺談 javascript 函數(shù)劫持
淺談 Javascript 中深復(fù)制
淺談 JavaScript 函數(shù)節(jié)流
淺談 JavaScript 中的 String 對(duì)象常用方法
淺談 JavaScript 事件的屬性列表
淺談 JavaScript 函數(shù)與棧
淺談 JavaScript 的事件
淺談 javascript 中的作用域
淺談 JavaScript 的執(zhí)行效率
淺談 Javascript 事件模擬
淺談 JavaScript function 函數(shù)種類
淺談 javascript 歸并方法
淺談 javascript 迭代方法
淺談 JavaScript 編程語言的編碼規(guī)范
淺談 JavaScript 實(shí)現(xiàn)面向?qū)ο笾械念?/span>
淺談 Javascript 鼠標(biāo)和滾輪事件
淺談 Javascript Base64 加密解密
淺談 Javascript 中勻速運(yùn)動(dòng)的停止條件
淺談 javascript 實(shí)現(xiàn)八大排序
淺談 javascript 的分號(hào)的使用
淺談 javascript 中 createElement 事件
淺談 javascript 的數(shù)據(jù)類型檢測
淺談 javascript 對(duì)象模型和 function 對(duì)象
淺談 Javascript 如何實(shí)現(xiàn)勻速運(yùn)動(dòng)
淺談 JavaScript 字符串與數(shù)組
淺談 javascript 面向?qū)ο蟪绦蛟O(shè)計(jì)
淺談 Javascript 事件處理程序的幾種方式

淺談 javascript 中的閉包

很長一段時(shí)間不理解閉包,后來了解了作用域,以及 this 相關(guān)問題才理解了閉包相關(guān)知識(shí)。

閉包(closure),也是面試題常客。簡單點(diǎn)來說就是函數(shù)嵌套函數(shù)。 函數(shù)作為返回值:

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

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

函數(shù)作為參數(shù):

[js] view plaincopy
var a = 10;  
function foo () {  
console.log(a);  
}  
function aaa(fn) {  
 var a = 100;  
 fn();  
}  
aaa(foo);  

按照我以前的理解,當(dāng)執(zhí)行在 aaa 函數(shù)里面執(zhí)行 fn 函數(shù),那么如果自身沒有 a 變量,就去父級(jí)作用域找 a 變量,此處是100,那結(jié)果是100嗎?

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

閉包的使用場景

因?yàn)楸救诉€比較菜鳥,在這里取一個(gè)簡單例子。當(dāng)點(diǎn)擊 li 的時(shí)候彈出 li 在 ul 中所處的位置即索引值。

html代碼:

[xhtml] view plaincopy
<ul>  
  <li>001</li>  
  <li>002</li>  
  <li>003</li>  
</ul>  

js代碼:

示例 1:

請(qǐng)看下面的代碼,運(yùn)行后發(fā)現(xiàn),無論點(diǎn)擊那個(gè)li,結(jié)果都是3了。

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

因?yàn)樵谀涿瘮?shù)里面并沒有 i 變量,所以當(dāng) for 結(jié)束后,我們?cè)偃c(diǎn)擊頁面的 li 標(biāo)簽,此時(shí)i 早就是3了。

示例 2:

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

這次的做法是把函數(shù)當(dāng)返回值,通過自執(zhí)行函數(shù)的參數(shù),把變量 i 傳進(jìn)去,然后因?yàn)榉祷睾瘮?shù)要引用這個(gè) i 變量,所以當(dāng) for 循環(huán)結(jié)束也不會(huì)釋放 i 變量。即在內(nèi)存中保存了 i 變量的值?;谶@樣的原理,很容易在低版本 ie 中造成內(nèi)存泄露。

示例 3:

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

這個(gè)原理和上面大同小異。

小米前端閉包面試題:

[js] view plaincopy
function repeat (func, times, wait) {  
} //這個(gè)函數(shù)能返回一個(gè)新函數(shù),比如這樣用  

var repeatedFun = repeat(alert, 10, 5000)  
//調(diào)用這個(gè) repeatedFun ("hellworld")  

//會(huì)alert十次 helloworld, 每次間隔5秒  

我的答案:

[js] view plaincopy
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");  

以上所述就是本文的全部內(nèi)容了,希望對(duì)大家學(xué)習(xí) javascript 閉包能夠有所幫助。