JavaScript 中定義函數的方式有兩種,一種是函數聲明,另一種是函數表達式。這兩種定義方式之間有一些細微的差別。
1.函數聲明:
function 關鍵字 + 函數名字 + 函數體構成了函數聲明,具體形式如下:
function functionName(arg0, arg1, arg2) { // function body }
Firefox、 Safari、 Chrome 和 Opera 都給函數定義了一個非標準的 name 屬性,通過這個屬性可以訪問到給函數指定的名字:
alert(functionName.name);//"functionName"
關於函數聲明的一個重要特徵就是函數聲明提升(function declaration hoisting),意爲在執行代碼前會先讀取函數聲明,也就是說可以在函數聲明前調用函數:
sayHello();//"Hello" function sayHello() { alert("Hello~"); }
2.函數表達式:
函數表達式有點類似常規的變量賦值語句,這種情況下創建的函數叫做匿名函數(anonymous function),具體形式如下:
var functionName = function(arg0, arg1, arg2) { // function body };
函數表達式與函數聲明主要有兩點不同,一是由於函數表達式定義的爲匿名函數,因此該變量的 name 屬性是空字符串:
alert(functionName.name);//""
二是函數表達式沒有函數聲明提升這一特性,因此不能再函數表達式前調用函數:
sayHello();//error var sayHello = function() { alert("ello~"); };
看一個例子,幫助我們更好地理解一下函數聲明函數表達式:
代碼片段一:
if (condition) { function sayHello() { alert("Hello version_1"); } } else { function sayHello() { alert("Hello version_2"); } }
表面上看,以上代碼表示在 condition 爲 true 時,使用一個 sayHello() 的定義,否則就使用另一個定義。但是這種方式很危險,可能會有意想不到的結果,但是,如果使用函數表達式,就沒有什麼問題了,如下代碼片段:
代碼片段二:
var sayHello; if (condition) { sayHello = function() { alert("Hello version_1"); }; } else { sayHello = function() { alert("Hello version_2"); }; }
本文出自 “細桶假狗屎” 博客,請務必保留此出處http://xitongjiagoushi.blog.51cto.com/9975742/1637798