首先,閉包是什麼?這個問題,百度上一大堆,而後我也是,如今學的有點累,來回顧一下吧算是,懂的自動略過,小弟不才,道行入不了大家法眼。es6
我認爲的閉包是,就是取到,不是在本身做用域內或者按照js的規則,娶(取)不到的老婆(值)。
也由於js 的一個弱類型,特性,能夠返回function 函數對象,也就形成了閉包這個概念,因此這個閉包的概念在其餘語言中也有。條件是,1.弱,2.能夠返回函數對象。面試
好,接下來,直接上例子講解:
算是自個人一種複習吧promise
第一種:閉包
function a(){
var s = "name";
return s;
}
var s = a()//name;函數
這是最爲普通的,原諒個人用詞,「普通」對象
第二種:原型鏈
function s(){
var dd = 'name;
return function(){
return dd;
}
}
//調用
var t = s();//這個獲得的是 函數 function(){return dd}
再次執行 t();//此時執行獲得的是 dd 爲name;作用域
那麼,我在原來的基礎上,再添加一點,考一下你們原型
var dd = "我是一個屌絲";
function s(){
var dd = 'name;
return function(){
return dd;
}
}
結果爲何?io
想
想
想
.
.
.
.
.
.
.
好吧答案仍是 : name ;
爲何呢?一個原型鏈,這個是js 的特性,還有一個是js代碼的執行過程。
再來:
第三種;
先寫一個面試題吧,我最近在看
for(var i=0;i<5;i++){
setTimeout(function(){
alert(i)
},1000)
}
結果,爲何?
我所理解的是一個延遲效應,setTimeout,
結果爲 55555
怎麼解決,利用閉包
for(var i=0;i<5;i++){
(function(i){
setTimeout(function(){
alert(i)
},1000)
}(i))
}
這樣就會循環出來,固然,若是你去試過 的回發現,是無序的。那麼怎麼解決這個問題,
聽說用的是es6 promise,這個我目前還不會嗎,學起來,到時再補充吧
基本上,閉包就是個樣子,休息一會,準備去吃飯了