閉包揭朝、立即執(zhí)行函數(shù) - 筆記

var items = document.querySelector('li')   //items是一個類數(shù)組對象

for(var i = 0; i<items.length; i++) {
   items[i].onclick = function() {
       console.log(i)
   }
}

首先,我們要理解變量的生命周期歪泳,舉個例子

function f1() {
    var a = 1
    return undefined
}

f1()  //這一行執(zhí)行萝勤,a就誕生了
      //執(zhí)行完了之后,a就死亡

如果變量被引用著呐伞,那么就不能死敌卓,也就是說不能被回收,比如

function f1() {
    var a = 1
    wondow.xxx = a    //a被外部引用伶氢,所以a不能死
    return undefined
}

f1() 


如果指定新的值趟径,那么a才會死亡

function f1() {
    var a = 1
    wondow.xxx = a    
    return undefined
}

f1() 

window.xxx = {name: 'b'}    //這個時候被重新賦值了

就近原則

var a

function f1() {
    var a
     function f2() {
         var a

         a = 1
     }
}

作用域只看父級

var a

function f1() {
    var a

    function f2() {
        var a
        f3() 
        a = 1
    }
}


function f3() {
    a = 2
}


這個例子當(dāng)中,f3()中的a指的就是最外部的a癣防,不管f3有沒有執(zhí)行蜗巧,只需要看函數(shù)與函數(shù)之間的父子關(guān)系。

立即執(zhí)行函數(shù)的意義

為什么會有立即執(zhí)行函數(shù)蕾盯? 是因為為了不產(chǎn)生全局變量钟哥,防止全局污染
一般比較推薦的寫法

!function() {
  var a = 1
  console.log(a)
}()


function sss(p1, p2) {

}
//基本等價于

function sss() {
    var p1 = arguments[0]
    var p2 = arguments[1]
}

arguments對應(yīng)于傳遞給函數(shù)的參數(shù)的類數(shù)組對象。

舉個例子

!function(a) {
  a = 1
  console.log(a)
}()

//相當(dāng)于
!function() {
    var a = arguments[0]   //沒有傳參硫豆,undefined,函數(shù)里面的a不是指全局的a
    a = 1
    console.log(a)
}(/*沒有參數(shù)*/)

所以像下面這樣:

var a = 100;
!function(a) {
  a = 1
  console.log(a)   //輸出1
}(/*沒有傳參*/)


console.log(a)  //  輸出100

變量提升

在執(zhí)行代碼之前渺尘,把所有的聲明提升到作用域的頂部,只要提升變量说敏,面試題就是小case

function a() {}
var a = 100

console.log(a)   //輸出100


//可以這樣看鸥跟,變量提升

var a
function a() {}

a = 100

console.log(a)     //輸出100


例子

var a = 100
f1()

function f1() {
    var b = 2
    if(b === 1) {
        var a
    }
    a = 99
}
//變量提升的寫法是這個樣子的

var a 

function f1() {
    var b
    b = 2
     var a
    if(b === 1) {
    
    }
    a = 99
}

a = 100

f1()

時機(異步)

btn.onclick = function() {
    console.log('A')
}
console.log('B')

//B一定會比A先執(zhí)行

var items
var i

items = document.querySelectorAll('li')

for(i = 0; i<items.length; i++) {
   items[i].onclick = function() {
       console.log(i)   //C
   }
}

console.log(i)   //D     //D比C先執(zhí)行

如果希望輸出不同的數(shù)字,可以這樣:在函數(shù)當(dāng)中創(chuàng)建一個新的作用域盔沫,跟外面一點關(guān)系都沒有医咨,就像這個樣子

var items
var i

items = document.querySelectorAll('li')

for(i = 0; i<items.length; i++) {
    var temp = function(j) {
        console.log(j)
    }
    temp(i)
    items[i].onclick = function() {
        console.log(i)
    }
}


console.log(j)   //這樣就可以了


繼續(xù)演化

var items
var i

items = document.querySelectorAll('li')
for(i = 0; i<items.length; i++) {
    !function(j) {
      console.log(j)
      items[j].onclick = function() {
        console.log(j)
    }
    }(i)
}

var items
var i

items = document.querySelectorAll('li')
for(i = 0; i<items.length; i++) {

    function temp(j) {
        return function() {
            console.log(j)
        }       
    }

    var fn = temp(i)

    items[i].onclick = fn
}
var items
var i

items = document.querySelectorAll('li')
for(i = 0; i<items.length; i++) {
    items[i].onclick = function(i) {
      return function() {
          console.log(i)
      }
    }(i)
}



閉包的作用

暴露局部變量,把局部變量通過函數(shù)暴露給外部

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末架诞,一起剝皮案震驚了整個濱河市拟淮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侈贷,老刑警劉巖惩歉,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異俏蛮,居然都是意外死亡撑蚌,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門搏屑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來争涌,“玉大人,你說我怎么就攤上這事辣恋×恋妫” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵伟骨,是天一觀的道長饮潦。 經(jīng)常有香客問我,道長携狭,這世上最難降的妖魔是什么继蜡? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮逛腿,結(jié)果婚禮上稀并,老公的妹妹穿的比我還像新娘。我一直安慰自己单默,他們只是感情好碘举,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搁廓,像睡著了一般引颈。 火紅的嫁衣襯著肌膚如雪耕皮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天线欲,我揣著相機與錄音明场,去河邊找鬼。 笑死李丰,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的逼泣。 我是一名探鬼主播趴泌,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拉庶!你這毒婦竟也來了嗜憔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤氏仗,失蹤者是張志新(化名)和其女友劉穎吉捶,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皆尔,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡呐舔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了慷蠕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片珊拼。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖流炕,靈堂內(nèi)的尸體忽然破棺而出澎现,到底是詐尸還是另有隱情,我是刑警寧澤每辟,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布剑辫,位于F島的核電站,受9級特大地震影響渠欺,放射性物質(zhì)發(fā)生泄漏妹蔽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一峻堰、第九天 我趴在偏房一處隱蔽的房頂上張望讹开。 院中可真熱鬧,春花似錦捐名、人聲如沸旦万。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽成艘。三九已至赏半,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間淆两,已是汗流浹背断箫。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秋冰,地道東北人仲义。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像剑勾,于是被迫代替她去往敵國和親埃撵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容