閉包吗冤、定時器

一、什么是閉包? 有什么作用

1.變量的作用域
??要理解閉包,首先必須理解JavaScript的變量作用域嘲碧。變量的作用域無非就是兩種:全局變量和局部變量稻励。在JavaScript中函數(shù)可以直接讀取外部的全局變量。

var a="你好";
function fun1(){
  alert(a);
}
fun1();//輸出"你好"

另一方面在函數(shù)外部,無法讀取函數(shù)內(nèi)部的變量愈涩。

function fun2(){
  var a="你好";
}
alert(a);//瀏覽器提示錯誤,VM55:4 Uncaught ReferenceError: a is not defined(…)

這里有一個問題需要注意,函數(shù)內(nèi)部聲明變量的時候,一定要使用var聲明,如果不使用var聲明,實(shí)際上是一個全局變量望抽。

function fun2(){
  a="你好";
}
fun2();
alert(a);//"你好"

2.如何從外部讀取局部變量
??當(dāng)我們需要獲取到函數(shù)內(nèi)部的變量的時候,我們就需要在函數(shù)的內(nèi)部在定義一個函數(shù)。

function fun1(){
  var a="你好";
  function fun2(){
    alert(a);//"你好"
  }
  return fun2();
}
fun1();

在上面的代碼中履婉,函數(shù)fun2就被包括在函數(shù)fun1內(nèi)部煤篙,這時fun1內(nèi)部的所有局部變量,對fun2都是可見的谐鼎。但是反過來就不行舰蟆,fun2內(nèi)部的局部變量趣惠,對fun1就是不可見的。這就是Javascript語言特有的"作用域鏈"結(jié)構(gòu)(chain scope)身害,子對象會一級一級地向上尋找所有父對象的變量味悄。所以,父對象的所有變量塌鸯,對子對象都是可見的侍瑟,反之則不成立。
??既然fun2可以讀取fun1中的局部變量,那么只要把fun2做為返回值就可以獲取到fun1中的變量了丙猬。那么函數(shù)fun2就可以成為閉包了涨颜。

3.閉包的概念
??由于在Javascript中,只有函數(shù)內(nèi)部的子函數(shù)才能讀取局部變量茧球,因此可以把閉包簡單理解成"定義在一個函數(shù)內(nèi)部的函數(shù)"庭瑰。所以,在本質(zhì)上抢埋,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來的一座橋梁弹灭。

4.閉包的作用
??閉包可以用在許多地方。它的最大用處有兩個揪垄,一個是前面提到的可以讀取函數(shù)內(nèi)部的變量穷吮,另一個就是讓這些變量的值始終保持在內(nèi)存中。

5.使用閉包的注意事項(xiàng)
??由于閉包會使得函數(shù)中的變量都被保存在內(nèi)存中饥努,內(nèi)存消耗很大捡鱼,所以不能濫用閉包,否則會造成網(wǎng)頁的性能問題酷愧,在IE中可能導(dǎo)致內(nèi)存泄露驾诈。解決方法是,在退出函數(shù)之前伟墙,將不使用的局部變量全部刪除翘鸭。

二滴铅、setTimeout 0 有什么作用

1.setTimeout() 方法用于在指定的毫秒數(shù)后調(diào)用函數(shù)或計(jì)算表達(dá)式戳葵。
2.setTimeout(f,0)的作用就是為了把f放到運(yùn)行隊(duì)列的最后去執(zhí)行。也就是說汉匙,無論setTimeout(f,0)寫在哪拱烁,當(dāng)之前的函數(shù)執(zhí)行完之后,f可以在最后立即執(zhí)行。

示例

如上圖代碼所示,當(dāng)1和3輸出之后,立即執(zhí)行的是2噩翠。

三戏自、下面的代碼輸出多少?修改代碼讓fnArr [i] () 輸出 i伤锚。使用兩種以上的方法

var fnArr = []; 
for (var i = 0; i < 10; i ++) {
     fnArr[i] = function(){ 
           return i;
     }; 
}
console.log( fnArr[3]() ); //

1.輸出的結(jié)果為10

結(jié)果

??我們可以先分析一下為什么輸出的結(jié)果為10:

示例

??如上圖所示,for循環(huán)內(nèi)的函數(shù)可以寫成下面一種形式,因?yàn)閞eturn返回的是遍歷數(shù)組后的最后一個值10,所以最后的結(jié)果都是10擅笔。

2.方法一:賦值給立即執(zhí)行函數(shù),外部需要傳遞參數(shù)。

方法一

3.方法二:賦值給立即執(zhí)行函數(shù)猛们,聲明一個臨時變量存儲i的值念脯,外部不需要傳參。

方法二

4.方法三:把它綁定在函數(shù)上弯淘,作為函數(shù)的一部分绿店,不需要通過閉包,得到函數(shù)就能得到值庐橙。

方法三

四假勿、使用閉包封裝一個汽車對象,可以通過如下方式獲取汽車狀態(tài)

var Car = //todo;
Car.setSpeed(30);
Car.getSpeed(); //30
Car.accelerate();
Car.getSpeed(); //40;
Car.decelerate();
Car.decelerate();
Car.getSpeed(); //20
Car.getStatus(); // 'running';
Car.decelerate(); 
Car.decelerate();
Car.getStatus(); //'stop';
//Car.speed; //error
方法

五态鳖、寫一個函數(shù)使用setTimeout模擬setInterval的功能

方法

1.setTimeout為延時性定時器,可以設(shè)置多長時間之后執(zhí)行代碼(只執(zhí)行一次)转培。
2.setInterval為間隔性定時器,可以設(shè)置每隔多久執(zhí)行一次代碼(執(zhí)行多次)浆竭。

六堡距、寫一個函數(shù),計(jì)算setTimeout平均[備注:新加]最小時間粒度

方法

七兆蕉、下面這段代碼輸出結(jié)果是? 為什么?

var a = 1;
setTimeout(function(){ 
     a = 2;
     console.log(a);
}, 0);
var a ;console.log(a);
a = 3;
console.log(a);
結(jié)果及原因

八羽戒、下面這段代碼輸出結(jié)果是? 為什么?

var flag = true;
setTimeout(function(){ 
    flag = false;
},0)
while(flag){}
console.log(flag);
結(jié)果

原因:以上代碼沒有輸出,因?yàn)閟etTimeout(f,0)會讓其包含的代碼在其它代碼執(zhí)行完后才能執(zhí)行虎韵;當(dāng)執(zhí)行完第一行代碼后直接跳到while語句易稠,而while語句中的判斷條件為真,將會一直執(zhí)行包蓝,進(jìn)入死循環(huán)驶社,所有沒有輸出。

九测萎、下面這段代碼輸出亡电?如何輸出delayer: 0, delayer:1...(使用閉包來實(shí)現(xiàn))

for(var i=0;i<5;i++){ 
    setTimeout(function(){ 
        console.log('delayer:' + i );
    }, 0); 
   console.log(i);
}

1.方法一:利用函數(shù)f()嵌套,形成閉包,輸出delayer+i的值。

方法一

2.方法二:

方法二
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末硅瞧,一起剝皮案震驚了整個濱河市份乒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌腕唧,老刑警劉巖或辖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異枣接,居然都是意外死亡颂暇,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門但惶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耳鸯,“玉大人湿蛔,你說我怎么就攤上這事∠嘏溃” “怎么了煌集?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長捌省。 經(jīng)常有香客問我苫纤,道長,這世上最難降的妖魔是什么纲缓? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任卷拘,我火速辦了婚禮,結(jié)果婚禮上祝高,老公的妹妹穿的比我還像新娘栗弟。我一直安慰自己,他們只是感情好工闺,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布乍赫。 她就那樣靜靜地躺著,像睡著了一般陆蟆。 火紅的嫁衣襯著肌膚如雪雷厂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天叠殷,我揣著相機(jī)與錄音改鲫,去河邊找鬼。 笑死林束,一個胖子當(dāng)著我的面吹牛像棘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播壶冒,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼缕题,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了胖腾?” 一聲冷哼從身側(cè)響起烟零,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胸嘁,沒想到半個月后瓶摆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凉逛,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡性宏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了状飞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毫胜。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡书斜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酵使,到底是詐尸還是另有隱情荐吉,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布口渔,位于F島的核電站样屠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏缺脉。R本人自食惡果不足惜痪欲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望攻礼。 院中可真熱鬧业踢,春花似錦、人聲如沸礁扮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽太伊。三九已至雇锡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間僚焦,已是汗流浹背遮糖。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叠赐,地道東北人欲账。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像芭概,于是被迫代替她去往敵國和親赛不。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350

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

  • 問題 1. 什么是閉包? 有什么作用? 概念:閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)惹苗。由于在Javascript語...
    小木子2016閱讀 323評論 0 0
  • 問答 1.什么是閉包? 有什么作用桩蓉? 閉包 簡而言之 就是讓函數(shù)外部可以訪問函數(shù)內(nèi)的局部變量,就是將函數(shù)內(nèi)部和函數(shù)...
    我是小韓閱讀 304評論 1 0
  • 一淋纲、什么是閉包?有什么作用 什么是閉包閉包是定義在一個函數(shù)內(nèi)部的函數(shù)院究,它可以訪問父級函數(shù)的內(nèi)部變量洽瞬。當(dāng)一個閉包被創(chuàng)...
    __Qiao閱讀 687評論 0 0
  • 問題 一伙窃、什么是閉包? 有什么作用菩颖? 1.什么是閉包①JavaScript高級程序設(shè)計(jì)第三版定義閉包是指有權(quán)訪問另...
    鴻鵠飛天閱讀 464評論 0 0
  • 1.什么是閉包? 有什么作用 閉包指有權(quán)訪問另一個函數(shù)作用域的變量的函數(shù)晦闰。創(chuàng)建閉包的常見方式 是 在一個函數(shù)...
    JunVincetHuo閱讀 1,373評論 0 2