函數聲明和函數表達式的區別
1. 函數聲明(function sayHello(){}):代碼執行以前,解析器就已經讀取函數聲明並將其添加到執行環境中,所以以下代碼運行正常:html
2. 函數表達式(var sayWorld = function(){}):這個會產生運行錯誤,緣由在於函數位於一個初始化語句中,而不是一個函數聲明,換句話說,在執行到函數所在語句以前,變量sayWorld不會保存對函數引用。測試
Function是javascript裏最經常使用的一個概念,javascript裏的function是最容易入手的一個功能,但它也是javascript最難理解最難掌握的一個概念。this
1、個人第一個javascript代碼url
界面加載時候就會彈出寫有「Hello World!」的對話框。我對function的第一印象就和java裏面方法沒啥區別了。可是當我看到這樣的代碼我就暈乎乎了。
2、javascript裏面定義函數的方法
1. 函數聲明
2. 函數表達式
3. 使用Function構造函數
以上三種均可以定義一個函數目的。大多數javascript書籍裏面不推薦使用第三種,緣由第三種存在嚴重的性能問題,這種定義會解析兩次代碼,第一次是常規的解析這條語句,第二次要把函數裏的字符串解析成實際的函數,可是它卻傳達了javascript的函數實際上是對象(object),而函數名是指向對象的指針。
所以我以爲理解函數function的關鍵把它看成對象object。Javascript對象存儲的方式:
Javascript數據是存在棧內存(stack)和堆內存(heap),堆內存存儲javascript對象的具體內容,而棧內存存儲對象的地址,下面的代碼:
ftn存儲在棧內存,function(){alert(‘hi’)};存儲在堆內存裏面,ftn的記錄的是function(){alert(‘hi’)};在堆內存的地址。所以下面的代碼:
彈出框顯示的是function的所有定義。若是代碼以下:
ftn()//hi
結果就是hi了。(通常執行函數,能夠在函數名後面加上括號,傳入須要傳入的參數)。
3、javascript裏面沒有函數重載
後面定義的方法會覆蓋前面的方法,若是咱們理解了「javascript的函數實際上是對象(object),而函數名是指向對象的指針」,這個就很好理解了,上面的寫法能夠改寫爲:
4、函數聲明和函數表達式的區別
兩個的定義見本文的條目二。對於這兩種方式的區別我在上一篇文章裏作過測試,我以爲個人猜想仍是頗有道理,不過這裏我仍是要提供一些權威的說法:
1. 函數聲明(function ftn(){}):代碼執行以前,解析器就已經讀取函數聲明並將其添加到執行環境中,所以以下代碼運行正常:
2.(代碼以下)函數表達式(var ftn = function(){}):這個會產生運行錯誤,緣由在於函數位於一個初始化語句中,而不是一個函數聲明,換句話說,在執行到函數所在語句以前,變量sayHello不會保存對函數引用。
5、函數能夠當作值使用
函數名是變量,因此函數能夠看成值來用,所以我開頭寫的那個代碼就能夠理解了,那是把函數做爲返回值。用過jQuery的人都會知道:$(document).ready(function(){}),這就是典型的把函數看成參數使用了。