看到一個 JS面試題 ,大約是這樣的
Js代碼
- <script>
- var x = 1, y = z = 0;
- function add(n) {
- n = n+1;
- }
- y = add(x);
- function add(n) {
- n = n + 3;
- }
- z = add(x);
- </script>
問執行完畢後 x, y, z 的值分别是多少?
仔細看的人馬上就知道了, x, y 和 z 分别是 1, undefined 和 undefined。
不過,如果将兩個 add 函數修改一下,題目變為
Js代碼
- <script>
- var x = 1, y = z = 0;
- function add(n) {
- return n = n+1;
- }
- y = add(x);
- function add(n) {
- return n = n + 3;
- }
- z = add(x);
- </script>
那麼這時 y 和 z 分别是什麼呢?我馬上想到是 2 和 4,不過結果卻是 4 和 4。
這說明,在第一次調用 add 函數之前,第二個 add 函數已經覆寫了第一個 add 函數。原來,這是 JS 解釋器的"預編譯",JS 解析器在執行語句前會将函數聲明和變量定義進行"預編譯",而這個"預編譯",并非一個頁面一個頁面地"預編譯",而是一段一段地預編譯,所謂的段就是一個 <script> 塊。且看下面的代碼
Js代碼
- <script>
- function add(n) {
- return n = n+1;
- }
- alert(add(1));
- </script>
- <script>
- function add(n) {
- return n = n+3;
- }
- alert(add(1));
- </script>
會分别彈出 2 和 4。