一道js變數上浮面試題

2022-03-30 23:14:15 字數 1646 閱讀 3256

function

a()

}b();

log(a);

}a();

輸出結果(下一行,拖動或ctrl+a)

■■■■■■■   輸出:   1    ■■■■■■■

解析:昨天去面試,就掉到上浮的坑里,本來是知道這個問題的,但是不太熟練又被迷惑。

最後面試官給我說,變數上浮,是在定義的時候產生的,執行時不存在這個問題。

來看這個題,a()函式 可以重新這樣寫

function

a();//

上浮至最高,變數a是函式

a=10;//

變數a又被賦值為10

return

;    }

vara;a=1;

b();

//執行b(),因為b上浮到頂部,所以先執行了b()中的a=10,然後才執行了上一行的a=1,所以最終結果是1

log(a);

}a();

(分割線,在這個題的基礎上修改一下)

function

test()

var b = 'ssss';

}test();

這個裡面函式a()和變數b的定義都是在return之後,輸出結果是什麼?

如果把a()的注釋去掉,會得到什麼?

輸出結果: function a()內容和undefined

這說明,在函式執行前(或者說函式執行時),function a()形式的宣告,可以提公升至作用域頂部,而var就不具備這個作用。

如果把注釋去掉,執行a(),則會報錯test未定義,說明函式只有在執行時才會檢查呼叫的變數是否存在,可以推想,未執行的函式內部如果有錯誤也是不會報錯的,請看下面這個**:

function

b()

不執行b(),是不會出現任何錯誤的。

再看一段**:

function

a()

}b();

console.log(a);

}a();

輸出:function a()

這是因為return後面的function a()提公升至頂部,並在當前函式作用域內宣告了乙個本地局域變數a,a=10賦值給該局域變數。

如果把return後面的function a()注釋掉,則輸出

這兩種輸出說明,function a()具有和var a同樣的作用,指定了a的作用域為函式體內。修改一下,比如:

function

a()

b();

console.log(a);

}a();

這裡b()函式體內的var a=10將變數a的作用域設定在函式體內,a=10的賦值就會在b函式內執行,而不會達到外部的a()函式。等價於:

function

a()

b();

console.log(a);

}a();

好了,看明白上面的內容,再來看餐後甜點:

var foo = 1;

function

main()

main();

new main();

輸出有什麼不同? 

一道面試題

一道面試題 射擊運動員10發打中90環有多少種可能,請編寫程式計算出來,並列印出結果,0環和10環均有效。打中90環就是沒打中10環,所以打中90環跟打中10環的可能性是一樣的。然後開始遞迴狂打槍,一到10就記錄 if params i 10 在迴圈的控制中已經排除了大於10的可能性 i 10 pa...

一道面試題

前些時候在找工作,就在準備結束此次找工作歷程的時候,去了一家公司面試,去了之後技術經理直接帶到一台電腦旁,給了一張紙條,上面是這樣的題目 用c或c 來實現 1 建立一棵樹,該樹的深度是隨機的,每個節點的位元組點數是隨機的。2 給每個節點分配一段隨機大小的記憶體空間,給每個節點賦乙個隨機數。3 遍歷這...

一道面試題

如果n為偶數,則將它除以2,如果n為奇數,則將它加1或者減1。問對於乙個給定的n,怎樣才能用最少的步驟將它變到1。例如 n 61 n 60 n 2 30 n 2 15 n 16 n 2 8 n 2 4 n 2 2 n 2 1 public class myclass public static vo...