題目如下:
var a = 0;
if (true)
a = 21;
console.log(a);
}console.log(a);
按照正常思路, 我們應該考慮變數提公升.
即是說, **等價於如下效果
function a()
var a = 0;
if (true)
console.log(a); //21
但話說回來, 把函式宣告寫在判斷語句中, 如果 被看做**塊的話
那麼函式的宣告應在**塊內做提公升.
即是說, **等價於如下效果
var a = 0;
if (true)
a = 1;
a = 21;
console.log(a); //21
}console.log(a); //0
然而實際的結果卻不是這樣的
先來看看ie的結果
21
21//以上列印結果為ie瀏覽器 10版本
但是到了ie11 和 最新的 edge瀏覽器就變了
21
function a()
//以上列印結果為ie瀏覽器 11版本 和 edge瀏覽器
顯然ie11認為, 函式宣告為全域性, 並且, 函式也沒有進行提公升, 而是當成了表示式
因此, **等價於
var a = 0;
if (true)
a1 = 21;
console.log(a1); //21
}console.log(a); // fn...
我們再測試谷歌和火狐瀏覽器:
21
1//以上列印結果為chrome瀏覽器 76.0.3809.87版本
谷歌瀏覽器跟火狐一致認為, 直到出現了函式宣告, 變數a才出現了區域性作用
函式依然被當成了表示式, 而不是乙個宣告
即是說, **等價於如下
var a = 0;
if (true)
a1 = 21;
console.log(a1); //21
}console.log(a); // 1
當函式被宣告在判斷語句內部時,
所有瀏覽器都將函式宣告當成了表示式(賦值宣告)
並且, 對於是否為全域性宣告, 也有分歧.
永遠不要把函式定義在條件判斷中
為什麼要出這種奇怪的題目來考察別人呢
是心理的扭曲? 還是道德的淪喪? ^_^
其實吧, 作為乙個正常的程式設計師
你或許從來不會把函式定義在判斷語句中
不知道很正常
知道了也不能說明什麼.
eric:如何用js檢測瀏覽器型別zhuanlan.zhihu.com
eric:js棧結構的簡單封裝zhuanlan.zhihu.com
eric:如何講清楚函式防抖?zhuanlan.zhihu.com
eric:formdata簡介zhuanlan.zhihu.com
一道JS面試題引發的血案
剛入職新公司,屬於公司萌新一枚,一天下午對著螢幕看 架構時。bi專案組長給我看了一道面試別人的js面試題。雖然答對了,但把理由說錯了,照樣不及格。話不多說,直接上題 var a 1 switch a result 最後什麼都不會輸出 看完題如果答對並且知道理由的小夥伴,僅當加深印象 如果你也像我一樣...
js一道很誇張的面試題
如題 var a 0 if true a 21 console.log 裡面 a console.log 外部 a 一開始 我認為結果很簡單 就是2個21 後來用谷歌瀏覽器 一列印 結果 竟然是 21和1 唯一的解釋 預解析的時候 應該是這樣的 var a a 0 0function a a 1 c...
關於一道JS面試題的思考
題目 for var i 0 i 5 i 1000 console.log new date,i 1 面對這段 時給出的結果也不盡相同,以下是典型的答案 a.20 的人會快速掃瞄 然後給出結果 0,1,2,3,4,5 b.30 的人會拿著 逐行看,然後給出結果 5,0,1,2,3,4 c.50 的人...