鍍金池/ 問答/HTML/ JS變量提升

JS變量提升

圖片描述

有哪位大神知道為什么最后一個console.log會報錯
我自己嘗試了debugger
發(fā)現(xiàn)if語句進(jìn)不去,a是等于1的

回答
編輯回答
敢試

a++ 是 0,然后 a 是 1

2017年6月6日 02:25
編輯回答
陌南塵

a++后自增,先參與運(yùn)算,然后在自身加1.

2017年2月12日 18:12
編輯回答
尐潴豬

你把var a=0 改成 var a=1試一試。

2017年12月6日 03:26
編輯回答
澐染

因為if (a++) {}的時候a還是0,所以直接執(zhí)行下面的console.log(a())

2017年4月14日 15:26
編輯回答
有你在

這個題目典型的考察js變量提升,注意,js變量提升只是大家常見的說法,嚴(yán)謹(jǐn)?shù)恼f這種類型的題還是考察js的底層執(zhí)行過程,就是js代碼是如何被解釋、編譯(可能有人會說:fuck,js會編譯?開什么玩笑...,我呵呵...)、執(zhí)行一整套完整流程,現(xiàn)在我們就按照變量提升的說法來解釋

這里特別說明,樓主的測試應(yīng)該是在chrome中進(jìn)行的,你在ie中試試,第一個console.log應(yīng)該是打印一個函數(shù),ie和標(biāo)準(zhǔn)瀏覽器對if這種條件的變量、函數(shù)預(yù)解析方式不一樣

可以查看資料:https://segmentfault.com/a/11...

2017年6月22日 00:21
編輯回答
帥到炸

這里有兩個坑:
一、在變量提升過程中有這樣的順序,函數(shù)形參 > 函數(shù) > 變量,另外,賦值操作會覆蓋聲明過程。
針對這題相當(dāng)于:

function a(){}
var a;
a = 0;// 這里的賦值操作會覆蓋前面聲明的function a,
....

二、js 引擎編譯過程的差異
代碼:

console.log(a);
var a = 0;
console.log(a);
if (a++) {
    function a() {console.log('function a')};
}
console.log(a());
  • chrome v8會在編譯對不執(zhí)行代碼(dead code)(這里時條件為false)進(jìn)行優(yōu)化,我的理解是這里function a(){} 這段被去除。所以這里function a 在執(zhí)行時就不存在提升了。
undefined
0
// 報錯
  • IE Chakra(我在IE11進(jìn)行了測試) 會把function a(){} 編譯進(jìn)去,就是和我們預(yù)期的函數(shù)、變量提升相同。
function a() {console.log('function a')};
0
// 報錯
2017年9月26日 22:54