首先,看看下面一個js例子,你覺得會輸出什么呢?
function fn(a){ a(); function a(){ console.log(2); } var a = function(){ console.log(3); } } fn(function(){console.log(1)});
如果你看不出來,可以copy到瀏覽器中試試喔。
本人已經在IE,Firefox,360瀏覽器下測試過,這段代碼都輸出2。這時,一些人就會有疑問,為什么呢,為什么不是1和3呢,其實,是這樣的:
var a = function(){console.log(3);}是預先"編譯"好的,參數function(){console.log(1)}是在創建執行環境時創建的,而function a(){ console.log(2);}是
在運行時即時"編譯"的,所以,參數a覆蓋var a, function a()又覆蓋參數a,所以最后打印2。可明白?
謝謝1樓和2樓的建議,糾正之前“編譯”的說法,因為是不需要“編譯”,它是通過js解釋器解釋執行的。這段代碼的執行順序如下:
function fn(a){ var a; function a(){ console.log(2); } a(); a = function(){ console.log(3); } } fn(function(){console.log(1)});
再看看,下面一個例子,你能猜出結果么?
function fn(a) { a(); var a = function () { console.log(3); } }
fn(function () { console.log(1) });
結果是1,相信你也能想到,道理跟前面一樣。
再看下面的例子。
function fn(a) { var a = function () {
console.log(3); } a(); } fn(function () { console.log(1) });
最后的結果是3,為什么呢,雖然參數a會在創建執行環境時覆蓋var a,但是,因為運行時執行a()之前,又執行了一遍var a = function () { console.log(3);},
再次編譯,又覆蓋參數a,所以最后打印3。(這是我的理解,有不同意見,可以在下面發表評論喔)
希望對你有用喔,有問題可以評論一起交流哦~
