函數(shù)
我們都知道, JavaScript是一種標本語言,是一種翻譯執(zhí)行的過程.
那么JavaScript的執(zhí)行中,有沒有類似編譯的過程呢?
先看一個例子:
<script>
alert(typeof f); // function
function f() {
alert("Just a test!");
};
</script>
這段代碼會彈出兩個彈窗,第一個顯示’function',第二個顯示’Just a test!'
有人會納悶,第一個alert的時候f函數(shù)還沒有被定義呀,為何會顯示類型呢 ?
其實這是因為JavaScript有預編譯的過程, JavaScript在執(zhí)行每一段代碼之前,都會首先處理var 關(guān)鍵字和function定義式(函數(shù)定義式和函數(shù)表達式).
我們都知道,在調(diào)用函數(shù)之前,會首先創(chuàng)建一個活動對象,然后搜尋這個函數(shù)中的局部變量定義,和函數(shù)定義,將變量名和函數(shù)名作為這個活動對象的同名屬性,對于局部變量定義,變量的值會在真正執(zhí)行的時候才計算,此時只是簡單的賦為undefined
而且對于函數(shù)定義式和函數(shù)表達式有一些不同之處,先看例子:
<script>
alert(typeof f); // function
alert(typeof another); // undefined
function f() { // 函數(shù)定義式
alert('Just a test!');
};
var another = function() { // 函數(shù)表達式
}
alert(typeof another); // function
</script>
這就是函數(shù)定義式和函數(shù)表達式的不同,對于函數(shù)定義式,會將函數(shù)定義提前.而函數(shù)表達式,會在執(zhí)行過程中才計算.
變量
先看例子:
var name = 'x';
age = 100;
我們都知道不使用var關(guān)鍵字定義的變量,相當于是全局變量,聯(lián)系到上面的分析不難得出:
在對age做標識符解析的時候,因為是些操作,所以當找到全局的window活動對象的時候沒有找到這個標識符的時候,會在window活動對象的基礎(chǔ)上,返回一個值為undefined的age屬性.
也就是說,age會被定義在頂級作用域中.
生命不息,折騰不止...
I'm not a real coder,but i love it so much!