国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

有趣的閉包

awesome23 / 2028人閱讀

摘要:金三銀四搞事季,前端這個(gè)近年的熱門領(lǐng)域,搞事氣氛特別強(qiáng)烈,我朋友小偉最近就在瘋狂面試,遇到了許多有趣的面試官,有趣的面試題,我來幫這個(gè)搞事轉(zhuǎn)述一下。小偉,你說說這幾行代碼會輸出什么當(dāng)面試官在打出這幾行代碼時(shí),我竟有點(diǎn)蒙蔽。

金三銀四搞事季,前端這個(gè)近年的熱門領(lǐng)域,搞事氣氛特別強(qiáng)烈,我朋友小偉最近就在瘋狂面試,遇到了許多有趣的面試官,有趣的面試題,我來幫這個(gè)搞事 boy 轉(zhuǎn)述一下。

以下是我一個(gè)朋友的故事,真的不是我。

for (var i = 0; i < 5; i++) {
  console.log(i);
}

“小偉,你說說這幾行代碼會輸出什么?”

當(dāng)面試官在 Sublime 打出這幾行代碼時(shí),我竟有點(diǎn)蒙蔽。蛤?這不是最簡單的一個(gè)循環(huán)嗎?是不是有陷阱啊,我思索一下,這好像和我看的那個(gè)閉包的題很像啊,這面試官是不是沒寫完啊?有毒啊。

“應(yīng)該是直接輸出 0 到 4 吧...”,我弱弱的說到。

“是啊,別緊張,這題沒啥陷阱,我就是隨便寫一下。”

(Excuse me?面試官你是來搞笑的嗎,嚇?biāo)览献恿耍。?/p>

“那你在看看這幾行代碼會輸出什么?”

for (var i = 0; i < 5; i++) {
  setTimeout(function() {
    console.log(i);
  }, 1000 * i);
}

額,什么鬼,怎么還不是我背了那么多遍的那道閉包題,讓我想想。 setTimeout 會延遲執(zhí)行,那么執(zhí)行到 console.log 的時(shí)候,其實(shí) i 已經(jīng)變成 5 了,對,就是這樣,這么簡單怎么可能難到老子。

“應(yīng)該是開始輸出一個(gè) 5,然后每隔一秒再輸出一個(gè) 5,一共 5 個(gè) 5。”

“對,那應(yīng)該怎么改才能輸出 0 到 4 呢?”

終于到我熟悉的了,加個(gè)閉包就解決了,穩(wěn)!

for (var i = 0; i < 5; i++) {
  (function(i) {
    setTimeout(function() {
      console.log(i);
    }, i * 1000);
  })(i);
}

“很好,那你能說一下,我刪掉這個(gè) i 會發(fā)生什么嗎?”

for (var i = 0; i < 5; i++) {
  (function() {
    setTimeout(function() {
      console.log(i);
    }, i * 1000);
  })(i);
}

“這樣子的話,內(nèi)部其實(shí)沒有對 i 保持引用,其實(shí)會變成輸出 5。”

“很好,那我給你改一下,你看看會輸出什么?”

for (var i = 0; i < 5; i++) {
  setTimeout((function(i) {
    console.log(i);
  })(i), i * 1000);
}

蛤?什么鬼,這是什么情況,讓我想想。這里給 setTimeout 傳遞了一個(gè)立即執(zhí)行函數(shù)。額,setTimeout 可以接受函數(shù)或者字符串作為參數(shù),那么這里立即執(zhí)行函數(shù)是個(gè)啥呢,應(yīng)該是個(gè) undefined ,也就是說等價(jià)于:

setTimeout(undefined, ...);

而立即執(zhí)行函數(shù)會立即執(zhí)行,那么應(yīng)該是立馬輸出的。

“應(yīng)該是立馬輸出 0 到 4 吧。”

“哎喲,不錯(cuò)哦,最后一題,你對 Promise 了解吧?”

“還可以吧...”

“OK,那你試試這道題。”

setTimeout(function() {
  console.log(1)
}, 0);
new Promise(function executor(resolve) {
  console.log(2);
  for( var i=0 ; i<10000 ; i++ ) {
    i == 9999 && resolve();
  }
  console.log(3);
}).then(function() {
  console.log(4);
});
console.log(5);

WTF!!!!我想靜靜!

這道題應(yīng)該考察我 JavaScript 的運(yùn)行機(jī)制的,讓我理一下思路。

首先先碰到一個(gè) setTimeout,于是會先設(shè)置一個(gè)定時(shí),在定時(shí)結(jié)束后將傳遞這個(gè)函數(shù)放到任務(wù)隊(duì)列里面,因此開始肯定不會輸出 1 。

然后是一個(gè) Promise,里面的函數(shù)是直接執(zhí)行的,因此應(yīng)該直接輸出 2 3 。

然后,Promise 的 then 應(yīng)當(dāng)會放到當(dāng)前 tick 的最后,但是還是在當(dāng)前 tick 中。

因此,應(yīng)當(dāng)先輸出 5,然后再輸出 4 。

最后在到下一個(gè) tick,就是 1 。

“2 3 5 4 1”

“好滴,等待下一輪面試吧。”

So easy!媽媽再也不用擔(dān)心我的面試了。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/93069.html

相關(guān)文章

  • 還擔(dān)心面試官問閉包

    摘要:一言以蔽之,閉包,你就得掌握。當(dāng)函數(shù)記住并訪問所在的詞法作用域,閉包就產(chǎn)生了。所以閉包才會得以實(shí)現(xiàn)。從技術(shù)上講,這就是閉包。執(zhí)行后,他的內(nèi)部作用域并不會消失,函數(shù)依然保持有作用域的閉包。 網(wǎng)上總結(jié)閉包的文章已經(jīng)爛大街了,不敢說筆者這篇文章多么多么xxx,只是個(gè)人理解總結(jié)。各位看官瞅瞅就好,大神還希望多多指正。此篇文章總結(jié)與《JavaScript忍者秘籍》 《你不知道的JavaScri...

    tinyq 評論0 收藏0
  • PHP新特性之閉包、匿名函數(shù)

    摘要:閉包閉包是什么閉包和匿名函數(shù)在中被引入。可以將匿名函數(shù)和閉包視作相同的概念。閉包和字符串或整數(shù)一樣,是一等值類型。何時(shí)使用我們通常把閉包當(dāng)做函數(shù)和方法的回調(diào)使用。 閉包 閉包是什么? 1).閉包和匿名函數(shù)在PHP5.3中被引入。2).閉包是指在創(chuàng)建時(shí)封裝函數(shù)周圍狀態(tài)的函數(shù),即使閉包所在的環(huán)境不存在了,閉包封裝的狀態(tài)依然存在,這一點(diǎn)和Javascript的閉包特性很相似。3).匿名函數(shù)就...

    luzhuqun 評論0 收藏0
  • 【闖關(guān)模式】作用域、鏈和閉包

    摘要:前言上篇闖關(guān)模式作用域鏈和閉包中任務(wù)四閉包閉包在中是很重要的概念,他們讓出色地完成異步任務(wù)。所以說,作用域,作用域鏈,閉包,垃圾回收機(jī)制,他們都是息息相關(guān)的你的任務(wù)你需要用的來檢驗(yàn)垃圾回收機(jī)制的運(yùn)行。 前言 上篇 【闖關(guān)模式】作用域、鏈和閉包 中 任務(wù)四 閉包(Closures) 閉包在JS中是很重要的概念,他們讓JS出色地完成異步任務(wù)。 為了能更好的理解閉包,我們先來看作用域鏈的例子...

    firim 評論0 收藏0
  • javascript中閉包一些理解

    摘要:眾所周知,閉包的一個(gè)作用就是讓一些變量始終保持在內(nèi)存中,在此我用一些實(shí)際代碼對這句話作進(jìn)一步的理解。輸出這個(gè)很好理解,不多說輸出輸出上述代碼中,就是執(zhí)行函數(shù)返回的匿名函數(shù)。 閉包是javascript中繞不開的話題,關(guān)于閉包的一些概念和應(yīng)用,這方面資料比較多,在此就不再贅述。眾所周知,閉包的一個(gè)作用就是 讓一些變量始終保持在內(nèi)存中 ,在此我用一些實(shí)際代碼對這句話作進(jìn)一步的理解。 dem...

    lansheng228 評論0 收藏0
  • 進(jìn)擊 JavaScript(四) 之 閉包

    摘要:此時(shí)產(chǎn)生了閉包。導(dǎo)致,函數(shù)的活動(dòng)對象沒有被銷毀。是不是跟你想的不一樣其實(shí),這個(gè)例子重點(diǎn)就在函數(shù)上,這個(gè)函數(shù)的第一個(gè)參數(shù)接受一個(gè)函數(shù)作為回調(diào)函數(shù),這個(gè)回調(diào)函數(shù)并不會立即執(zhí)行,它會在當(dāng)前代碼執(zhí)行完,并在給定的時(shí)間后執(zhí)行。 上一節(jié)說了執(zhí)行上下文,這節(jié)咱們就乘勝追擊來搞搞閉包!頭疼的東西讓你不再頭疼! 一、函數(shù)也是引用類型的。 function f(){ console.log(not cha...

    Anleb 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<