閉包,定時器

問題

1.什么是閉包? 有什么作用

閉包(英語:Closure)肛真,又稱詞法閉包(Lexical Closure)或函數(shù)閉包(function closures)写妥,是引用了自由變量的函數(shù)媚污。這個被引用的自由變量將和這個函數(shù)一同存在断医,即使已經(jīng)離開了創(chuàng)造它的環(huán)境也不例外。所以债蓝,有另一種說法認為閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實體壳鹤。閉包在運行時可以有多個實例,不同的引用環(huán)境和相同的函數(shù)組合可以產(chǎn)生不同的實例饰迹。
在函數(shù)內(nèi)定義的變量,在其內(nèi)部返回函數(shù),返回的函數(shù)使用函數(shù)定義的變量,就會形成閉包;閉包可以減少全局變量,還可以對函數(shù)進行封裝;
下面例子形成了簡單的閉包

function f1() {
       var a=10;
       var b=20;
       function f2() {
           console.log(a);
       }
       f2();
   }
   f1();

應(yīng)用更多的形式:

function f1() {
       var a=10;
       var b=20;
       return function f2() {
           console.log(a);
       }
       
   }
   var result=f1();
   console.log(result());

2.setTimeout 0 有什么作用

使用setTimeout 0可以實現(xiàn)異步芳誓,可以等待當前任務(wù)完成之后,在執(zhí)行setTimeout 0里面函數(shù)的內(nèi)容啊鸭,因為javascript是單線程執(zhí)行代碼的锹淌,無法同時執(zhí)行多段代碼,所以當一個代碼執(zhí)行的時候赠制,后續(xù)的代碼必須等待赂摆,形成一個隊列,一旦當前任務(wù)執(zhí)行完畢,才從隊列中取出下面的一個任務(wù)執(zhí)行烟号,使用seTimeout 0就是利用了這個特性來延遲執(zhí)行順序绊谭。

代碼題

1.下面的代碼輸出多少?修改代碼讓fnArr[i]() 輸出 i汪拥。使用兩種以上的方法

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

輸出10;
方法一:

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

方法二:

function f() {
        function test(x) {
            return function() {
                return x;
            }
        }
        var a = [];
        for (var i = 0; i < 10; i++) {
            a[i] = test(i);
        }
        return a;
    }
    var fnArr = f();
    console.log(fnArr[9]()); //

2.使用閉包封裝一個汽車對象达传,可以通過如下方式獲取汽車狀態(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
var Car = (function() {
        var speed = 0;
        var status = 'stop';
        var acceleratevalue = 10;
        var deceleratevalue = -10;

        function getSpeed() {
            console.log(speed);
        }

        function setSpeed(num) {
            speed = num;
            console.log(speed);
        }

        function accelerate() {
            speed += acceleratevalue;
            console.log(speed);
        }

        function decelerate() {
            speed += deceleratevalue;
            console.log(speed);
        }

        function getStatus() {
            status = speed > 0 ? 'running' : 'stop';
            console.log(status);
        }
        return {
            setSpeed: setSpeed,
            getSpeed: getSpeed,
            accelerate: accelerate,
            decelerate: decelerate,
            getStatus: getStatus
        }
    })();
    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

3.寫一個函數(shù)使用setTimeout模擬setInterval的功能

var i=0;
function interval(){
    setTimeout(function(){
        console.log(i++);
        interval();
    },1000);
}
interval();

4.寫一個函數(shù),計算setTimeout最小時間粒度

function getMini() {
        var i = 0;
        var start = Date.now();
        var clock = setTimeout(
        function() {
            i++;
            if (i === 1000) {
                clearTimeout(clock);
                var end = Date.now();
                console.log((end - start) / i);
            }
            clock = setTimeout(arguments.callee, 2)
        }, 2)
    }

    console.log(getMini())

5.下面這段代碼輸出結(jié)果是? 為什么?

var a = 1;
setTimeout(function(){
    a = 2;
    console.log(a);
}, 0);
var a ;
console.log(a);
a = 3;
console.log(a);

setTimeout函數(shù)放在其他語句后面執(zhí)行,輸出1,3,2

6.下面這段代碼輸出結(jié)果是? 為什么?

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

//無限循環(huán)沒有輸出迫筑。flag的初始值為true宪赶,而setTimeout的delay值被設(shè)為0,也就意味著里面的函數(shù)要等待其他語句全部執(zhí)行完畢才會運行脯燃。而while(flag){}因為flag為true的關(guān)系永遠不會停止逊朽,所以console.log(flag)也就永遠不會執(zhí)行。

7.下面這段代碼輸出曲伊?如何輸出delayer: 0, delayer:1...

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

輸出

0
1
2
3
4
delayer:4
delayer:4
delayer:4
delayer:4
delayer:4

輸出delayer: 0, delayer:1...

for (var i = 0; i < 5; i++) {
        setTimeout(
            (function(num) {
                return function() {
                    console.log('delayer:' + num);
                }
            })(i), 0);
        console.log(i);
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市追他,隨后出現(xiàn)的幾起案子坟募,更是在濱河造成了極大的恐慌,老刑警劉巖邑狸,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件懈糯,死亡現(xiàn)場離奇詭異,居然都是意外死亡单雾,警方通過查閱死者的電腦和手機赚哗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硅堆,“玉大人屿储,你說我怎么就攤上這事〗ヌ樱” “怎么了够掠?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長茄菊。 經(jīng)常有香客問我疯潭,道長,這世上最難降的妖魔是什么面殖? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任竖哩,我火速辦了婚禮,結(jié)果婚禮上脊僚,老公的妹妹穿的比我還像新娘相叁。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布钝荡。 她就那樣靜靜地躺著街立,像睡著了一般。 火紅的嫁衣襯著肌膚如雪埠通。 梳的紋絲不亂的頭發(fā)上赎离,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音端辱,去河邊找鬼梁剔。 笑死,一個胖子當著我的面吹牛舞蔽,可吹牛的內(nèi)容都是我干的荣病。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渗柿,長吁一口氣:“原來是場噩夢啊……” “哼个盆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起朵栖,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤颊亮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后陨溅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體终惑,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年门扇,在試婚紗的時候發(fā)現(xiàn)自己被綠了雹有。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡臼寄,死狀恐怖霸奕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吉拳,我是刑警寧澤铅祸,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站合武,受9級特大地震影響临梗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜稼跳,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一盟庞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧汤善,春花似錦什猖、人聲如沸票彪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽降铸。三九已至,卻和暖如春摇零,著一層夾襖步出監(jiān)牢的瞬間推掸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工驻仅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谅畅,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓噪服,卻偏偏與公主長得像毡泻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子粘优,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

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

  • 問題 一雹顺、什么是閉包? 有什么作用邪铲? 閉包閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。在javascript中无拗,只有函...
    婷樓沐熙閱讀 582評論 0 0
  • 1.什么是閉包? 有什么作用 定義:閉包就是嵌套在函數(shù)里面的內(nèi)部函數(shù)英染,并且該內(nèi)部函數(shù)可以訪問外部函數(shù)中聲明的所有局...
    饑人谷區(qū)子銘閱讀 940評論 0 2
  • 本教程版權(quán)歸小圓和饑人谷所有四康,轉(zhuǎn)載須說明來源 問題 什么是閉包? 有什么作用閉包(closure)是指有權(quán)訪問另一...
    饑人谷__小圓閱讀 496評論 0 0
  • 1.什么是閉包? 有什么作用 閉包指有權(quán)訪問另一個函數(shù)作用域的變量的函數(shù)闪金。創(chuàng)建閉包的常見方式 是 在一個函數(shù)...
    JunVincetHuo閱讀 1,387評論 0 2
  • 問答 1.什么是閉包? 有什么作用哎垦? 閉包 簡而言之 就是讓函數(shù)外部可以訪問函數(shù)內(nèi)的局部變量,就是將函數(shù)內(nèi)部和函數(shù)...
    我是小韓閱讀 306評論 1 0