函數聲明和函數表達式的區別

函數聲明和函數表達式的區別 javascript

1.      函數聲明(function sayHello(){}):代碼執行以前,解析器就已經讀取函數聲明並將其添加到執行環境中,所以以下代碼運行正常:html

 

sayHello(); java

function sayHello() web

{ 函數

    alert( ' Hello ' ); post

} 性能

 

 

2.      函數表達式(var sayWorld = function(){}):這個會產生運行錯誤,緣由在於函數位於一個初始化語句中,而不是一個函數聲明,換句話說,在執行到函數所在語句以前,變量sayWorld不會保存對函數引用。測試

 

sayWorld();
var sayWorld = function ()
{
    alert('World');
}
 
 
原文引用以下:

javascript筆記:深刻理解javascript的function

Functionjavascript裏最經常使用的一個概念,javascript裏的function是最容易入手的一個功能,但它也是javascript最難理解最難掌握的一個概念。this

1、個人第一個javascript代碼url

1 function test()
2 {
3     alert( ' Hello World! ' );
4 }   
5 window.onload = test(); // Hello World!

界面加載時候就會彈出寫有「Hello World!」的對話框。我對function的第一印象就和java裏面方法沒啥區別了。可是當我看到這樣的代碼我就暈乎乎了。

複製代碼
1 function test(num)
2 {
3 return function ()
4     {
5 if (num > 0 )
6         {
7 return ' 正數 ' ;
8         } else if (num < 0 )
9         {
10 return ' 負數 ' ;
11         } else {
12 return ' ' ;
13         }
14     }
15 }   
16 window.onload = alert(test( 11 )()); //
複製代碼

2、javascript裏面定義函數的方法

1.       函數聲明

複製代碼
1 function sum(a,b)
2 {
3 return a + b;
4 }   
5
6 alert(sum( 10 , 20 )); // 30
複製代碼

2.       函數表達式

複製代碼
1 var sum = function (a,b)
2 {
3 return a + b;
4 };
5
6 alert(sum( 10 , 20 )); // 30
複製代碼

3.       使用Function構造函數

1 var sum = new Function( " a " , " b " , " return a+b " );
2 alert(sum( 10 , 20 )); // 30

  以上三種均可以定義一個函數目的。大多數javascript書籍裏面不推薦使用第三種,緣由第三種存在嚴重的性能問題,這種定義會解析兩次代碼,第一次是常規的解析這條語句,第二次要把函數裏的字符串解析成實際的函數,可是它卻傳達了javascript的函數實際上是對象(object,而函數名是指向對象的指針

    所以我以爲理解函數function的關鍵把它看成對象objectJavascript對象存儲的方式:

   Javascript數據是存在棧內存(stack)和堆內存(heap),堆內存存儲javascript對象的具體內容,而棧內存存儲對象的地址,下面的代碼:

  

1 var ftn = function (){alert(‘hi’)};

 

ftn存儲在棧內存,function(){alert(‘hi’)};存儲在堆內存裏面,ftn的記錄的是function(){alert(‘hi’)};在堆內存的地址。所以下面的代碼:

1 alert(ftn); // var ftn = function(){alert(‘hi’)};

彈出框顯示的是function的所有定義。若是代碼以下:

ftn()//hi

結果就是hi了。(通常執行函數,能夠在函數名後面加上括號,傳入須要傳入的參數)。

3、javascript裏面沒有函數重載

複製代碼
1 function sum(num)
2 {
3 return num + 10 ;
4 }   
5 function sum(num)
6 {
7 return num + 30 ;
8 }
9 alert(sum( 10 )); // 40
複製代碼

後面定義的方法會覆蓋前面的方法,若是咱們理解了「javascript的函數實際上是對象(object,而函數名是指向對象的指針」,這個就很好理解了,上面的寫法能夠改寫爲:

複製代碼
1 var sum = function (num)
2 {
3 return num + 10 ;
4 }   
5 sum = function (num)
6 {
7 return num + 30 ;
8 }
9 alert(sum( 10 )); // 40
複製代碼

4、函數聲明和函數表達式的區別

兩個的定義見本文的條目二。對於這兩種方式的區別我在上一篇文章裏作過測試,我以爲個人猜想仍是頗有道理,不過這裏我仍是要提供一些權威的說法:

1.       函數聲明(function ftn(){}):代碼執行以前,解析器就已經讀取函數聲明並將其添加到執行環境中,所以以下代碼運行正常:

1 sayHello();
2 function sayHello()
3 {
4     alert( ' Hello ' );
5 }

2.(代碼以下)函數表達式(var ftn = function(){}):這個會產生運行錯誤,緣由在於函數位於一個初始化語句中,而不是一個函數聲明,換句話說,在執行到函數所在語句以前,變量sayHello不會保存對函數引用。

1 sayHello();
2 var sayHello = function ()
3 {
4     alert( ' Hello ' );
5 }

5、函數能夠當作值使用

函數名是變量,因此函數能夠看成值來用,所以我開頭寫的那個代碼就能夠理解了,那是把函數做爲返回值。用過jQuery的人都會知道:$(document).ready(function(){}),這就是典型的把函數看成參數使用了。

 


相關文章
相關標籤/搜索