成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

分析 HTTP 203 出的一個(gè) JS 題目

Caicloud / 2304人閱讀

摘要:是上的一個(gè)欄目,主要講一些有趣的知識(shí)。分析下上述代碼中,變量是命令聲明的,在全局范圍內(nèi)都有效,所以全局只有一個(gè)變量。

后續(xù)內(nèi)容更新,請(qǐng)前往:個(gè)人博客,歡迎一起交流。

這是一道出自 HTTP 203 的 JS 題目。HTTP 203 是 Youtube 上的一個(gè)欄目,主要講一些有趣的知識(shí)。

原題目是這樣的:

for(
  let i = (setTimeout(()=>console.log(i), 2333), 0);
  i < 2;
  i++
) {
  
}

// 問(wèn) 2333 毫秒之后打印出什么

答案是 2333 毫秒后打印出 0。 為什么呢?

在開(kāi)始分析題目之前,我們先來(lái)回顧幾個(gè)知識(shí)點(diǎn):

for 語(yǔ)法
for (語(yǔ)句 1; 語(yǔ)句 2; 語(yǔ)句 3) {
    被執(zhí)行的代碼塊
}

語(yǔ)句 1(代碼塊)開(kāi)始前執(zhí)行;
語(yǔ)句 2 定義運(yùn)行循環(huán)(代碼塊)的條件;
語(yǔ)句 3 在循環(huán)(代碼塊)已被執(zhí)行之后執(zhí)行;

執(zhí)行的順序?yàn)椋?br>1.第一次循環(huán),即初始化循環(huán)。
首先執(zhí)行語(yǔ)句1(一般為初始化語(yǔ)句),再執(zhí)行語(yǔ)句2(一般為條件判斷語(yǔ)句),判斷語(yǔ)句1是否符合語(yǔ)句2的條件,如果符合,則執(zhí)行代碼塊,否則,停止執(zhí)行,最后執(zhí)行語(yǔ)句3。
2.其他循環(huán):
首先判斷前一次語(yǔ)句3的執(zhí)行結(jié)果是否符合執(zhí)行語(yǔ)句2的條件,如果符合,繼續(xù)執(zhí)行代碼塊,否則停止執(zhí)行,最后執(zhí)行語(yǔ)句3。如此往復(fù),直到前一次語(yǔ)句3的執(zhí)行結(jié)果不滿足符合執(zhí)行語(yǔ)句2的條件。

總的來(lái)說(shuō),執(zhí)行順序是一致的,先執(zhí)行條件判斷(語(yǔ)句2),再執(zhí)行代碼塊,最后執(zhí)行語(yǔ)句3。如此往復(fù),區(qū)別在于條件判斷的對(duì)象,在第一次判斷時(shí),是執(zhí)行語(yǔ)句1,初始化的對(duì)象,后續(xù)的判斷對(duì)象是執(zhí)行語(yǔ)句3的結(jié)果。

逗號(hào)表達(dá)式

逗號(hào)表達(dá)式,因?yàn)樵}目中就有使用逗號(hào)表達(dá)式let i = (setTimeout(()=>console.log(i), 2333), 0);。

逗號(hào)表達(dá)式的一般形式是:表達(dá)式1,表達(dá)式2,表達(dá)式3......表達(dá)式n。
逗號(hào)表達(dá)式的求解過(guò)程是:先計(jì)算表達(dá)式1的值,再計(jì)算表達(dá)式2的值,......一直計(jì)算到表達(dá)式n的值。最后整個(gè)逗號(hào)表達(dá)式的值是表達(dá)式n的值。 看下面幾個(gè)例子:

x=8*2, x*4  // 整個(gè)表達(dá)式的值為64,x的值為16

(x=8*2, x*4), x*2 // 整個(gè)表達(dá)式的值為32,x的值為16

x=(z=5, 5*2) // 整個(gè)表達(dá)式為賦值表達(dá)式,它的值為10,z的值為5,x的值為10

x=z=5, 5*2 // 整個(gè)表達(dá)式為逗號(hào)表達(dá)式,它的值為10,x和z的值都為5

逗號(hào)表達(dá)式用的地方不太多,一般情況是在給循環(huán)變量賦初值時(shí)才用得到。所以程序中并不是所有的逗號(hào)都要看成逗號(hào)運(yùn)算符,尤其是在函數(shù)調(diào)用時(shí),各個(gè)參數(shù)是用逗號(hào)隔開(kāi)的,這時(shí)逗號(hào)就不是逗號(hào)運(yùn)算符。

基礎(chǔ)知識(shí)回顧完畢,我們通過(guò)幾個(gè)簡(jiǎn)單示例一步一步地逼近原題目:

示例一:基礎(chǔ)知識(shí) for 循環(huán)
for (var i = 0; i < 2; i++) {
    console.log(i);
}

// 打印什么

這個(gè)無(wú)需多說(shuō),答案輸出 0 1。

示例二:我們稍微改造下,將 log 放入 setTimeout 中
for (var i = 0; i < 2; i++) {
    setTimeout(() => console.log(i));
}

// 打印什么

答案輸出 2 2。分析下:
上述代碼中,變量 i 是 var 命令聲明的,在全局范圍內(nèi)都有效,所以全局只有一個(gè)變量 i。每一次循環(huán),變量 i 的值都會(huì)發(fā)生改變,而循環(huán)內(nèi)被賦給 setTimeout 內(nèi)部的 console.log(i),里面的 i 指向的就是全局的 i。也就是說(shuō),這里面所有的 i 指向的都是同一個(gè) i,導(dǎo)致運(yùn)行時(shí)輸出的是最后一輪的 i 的值,也就是 2。

示例三:我再稍微改造下,將上述 var 改為 let。
for (let i = 0; i < 2; i++) {
    setTimeout(() => console.log(i));
}

// 打印什么

答案輸出 0 1。分析下:
上述代碼中,變量 i 是 let 聲明的,當(dāng)前的 i 只在本輪循環(huán)有效,所以每一次循環(huán)的 i 其實(shí)都是一個(gè)新的變量,所以最后輸出的是0 1。你可能會(huì)問(wèn),如果每一輪循環(huán)的變量i都是重新聲明的,那它怎么知道上一輪循環(huán)的值,從而計(jì)算出本輪循環(huán)的值?這是因?yàn)?JavaScript 引擎內(nèi)部會(huì)記住上一輪循環(huán)的值,初始化本輪的變量i時(shí),就在上一輪循環(huán)的基礎(chǔ)上進(jìn)行計(jì)算。

原題目
for(
  let i = (setTimeout(()=>console.log(i), 2333), 0); // 語(yǔ)句1
  i < 2; // 語(yǔ)句2
  i++ // 語(yǔ)句3
) {
  
}

// 問(wèn) 2333 毫秒之后打印出什么

答案是 2333 毫秒后打印出 0。分析下:
上述題目中,變量 i 是 let 聲明的,當(dāng)前的 i 只在本輪循環(huán)有效,后面的表達(dá)式是逗號(hào)表達(dá)式,取最后一個(gè)值,即 i = 0,settimeout 在語(yǔ)句1,由于語(yǔ)句1只在第一次循環(huán)執(zhí)行,因此 settimeout 的作用域是第一次迭代的作用域,且只執(zhí)行一次。第一次迭代時(shí) i = 0,所以答案是 2333 毫秒后打印出 0。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/97938.html

相關(guān)文章

  • Javascript混淆與解混淆的那些事兒

    摘要:抽象語(yǔ)法樹(shù)大致流程生成然后通過(guò)類型斷言進(jìn)行相應(yīng)的轉(zhuǎn)換反編譯工具全集小程序推薦逆向反編譯四大工具利器年支持的反編譯工具匯總原文 像軟件加密與解密一樣,javascript的混淆與解混淆同屬于同一個(gè)范疇。道高一尺,魔高一丈。沒(méi)有永恒的黑,也沒(méi)有永恒的白。一切都是資本市場(chǎng)驅(qū)動(dòng)行為,現(xiàn)在都流行你能為人解決什么問(wèn)題,這個(gè)概念。那么市場(chǎng)究竟能容納多少個(gè)能解決這種問(wèn)題的利益者。JS沒(méi)有秘密。 其實(shí)本...

    Yujiaao 評(píng)論0 收藏0
  • LeetCode 攻略 - 2019 年 7 月上半月匯總(55 題攻略)

    摘要:微信公眾號(hào)記錄截圖記錄截圖目前關(guān)于這塊算法與數(shù)據(jù)結(jié)構(gòu)的安排前。已攻略返回目錄目前已攻略篇文章。會(huì)根據(jù)題解以及留言內(nèi)容,進(jìn)行補(bǔ)充,并添加上提供題解的小伙伴的昵稱和地址。本許可協(xié)議授權(quán)之外的使用權(quán)限可以從處獲得。 Create by jsliang on 2019-07-15 11:54:45 Recently revised in 2019-07-15 15:25:25 一 目錄 不...

    warmcheng 評(píng)論0 收藏0
  • LeetCode【203】:移除鏈表元素

    摘要:題目描述刪除鏈表中等于給定值的所有節(jié)點(diǎn)。示例輸入輸出非遞歸解法思路遍歷鏈表,找出每個(gè)待刪除節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)。特殊情況第一個(gè)節(jié)點(diǎn)就是待刪除節(jié)點(diǎn)時(shí),要單獨(dú)操作。注意點(diǎn)當(dāng)輸入為時(shí),按上面的思路刪除第一個(gè)節(jié)點(diǎn),剩下的鏈表的頭節(jié)點(diǎn)又是待刪除節(jié)點(diǎn)。 題目描述 刪除鏈表中等于給定值 val 的所有節(jié)點(diǎn)。 示例 輸入: 1->2->6->3->4->5->6, val = 6輸出: 1->2->3->...

    wwolf 評(píng)論0 收藏0
  • 怎么通過(guò)$a獲取到$b?某豹面試題

    摘要:原題,跳轉(zhuǎn)到怎么通過(guò)獲取到請(qǐng)用實(shí)現(xiàn)看一分鐘之后,直覺(jué)告訴實(shí)現(xiàn)我不會(huì)。只知道,通過(guò)可以知道后來(lái)百度,問(wèn)好朋友。真實(shí)意圖這道題的意思應(yīng)該是重定向后怎么獲取真實(shí)地址。實(shí)際做的就是在百度或者微博服務(wù)器上一個(gè)臨時(shí)重定向。 原題: $a=http://aaa.com/a,跳轉(zhuǎn)到$b=http://bbb.com/b.怎么通過(guò)$a獲取到$b,請(qǐng)用php實(shí)現(xiàn) 看一分鐘之后,直覺(jué)告訴PHP實(shí)現(xiàn)我不會(huì)。...

    Flands 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

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