javascript 函數聲明和函數表達式的區別(學習筆記)

javascript中聲明函數的方法有兩種:函數聲明式和函數表達式.javascript

區別以下:java

1).以函數聲明的方法定義的函數,函數名是必須的,而函數表達式的函數名是可選的.chrome

2).以函數聲明的方法定義的函數,函數能夠在函數聲明以前調用,而函數表達式的函數只能在聲明以後調用.ide

3).以函數聲明的方法定義的函數並非真正的聲明,它們僅僅能夠出如今全局中,或者嵌套在其餘的函數中,可是它們不能出如今循環,條件或者try/catch/finally中,而函數

    函數表達式能夠在任何地方聲明.spa

下面分別用兩種方法定義函數:firefox

 1 //函數聲明式
 2 function greeting(){
 3       console.log("hello world");  
 4 }
 5 
 6 
 7 //函數表達式
 8 var greeting = function(){
 9     console.log("hello world"); 
10 }

下面一個有趣的javascript:code

1 function f() { console.log('I am outside!'); }
2 (function () {
3   if(false) {
4     // 重複聲明一次函數f
5     function f() { console.log('I am inside!'); }
6   }
7   f();
8 }());

會輸出什麼呢?第一反應應該是"I am outside"吧.  結果在chrome中輸出"I am inside",IE11直接報錯,firefox低一點的版本輸出"I am outside"...對象

chrome輸出的結果很明確的反應了用函數聲明式聲明的函數的特色--函數在聲明以前就能夠調用.blog

IE報錯顯示缺乏對象,由於函數聲明在了條件裏,違背了函數聲明式的原則.

 

函數表達式的做用域:

若是函數表達式聲明的函數有函數名,那麼這個函數名就至關於這個函數的一個局部變量,只能在函數內部調用,舉個栗子:

1 var f = function fact(x) { 
2                 if (x <= 1) 
3                     return 1;
4                 else 
5                     return x*fact(x-1);
6                 };
7                 alert(fact());   // Uncaught ReferenceError: fact is not defined
fact()在函數內部能夠調用,在函數外部調用就會報錯:fact未定義.
fact
相關文章
相關標籤/搜索