一個有意思的js實例,你會嗎??[原創]


  首先,看看下面一個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。(這是我的理解,有不同意見,可以在下面發表評論喔)

  希望對你有用喔,有問題可以評論一起交流哦~

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM