ECMAScript 的函數實際上是功能完整的對象。
函數的了解
用 Function 類直接建立函數,格式如下。可了解為Function構造器。
var function_name = new Function(arg1, arg2, ..., argN, function_body)
通過Function類定義一個函數
var sayHi = new Function("sName", "sMessage", "alert("Hello " + sName + sMessage);");
出于效率原因我們一般不這麼寫。而采用下面的寫法
function sayHi(sName, sMessage) {
alert("Hello " + sName + sMessage);
}
但我們隻要知道所有函數都應看作 Function 類的執行個體。函數名隻是指向函數對象的引用值,行為就像其他對象一樣。
怎麼了解行為?函數預設有length屬性,跟其他對象一樣預設也有valueOf() 方法及 toString() 方法。
函數的定義
定義函數有多種方式,大緻分兩類,聲明式和表達式
1. 最普通的,以function開頭
function foo(a, b){
return a+b;
}
2. 将函數表達式指派給一個變量
var foo = function (a, b){
return a+b;
}
立即執行表達式
(function(){
// do sth
})()
将函數對象作為表達式傳回
return function(){
// do sth
}
命名的函數表達式
var add = function foo(a, b){
// do sth
};
函數聲明和函數表達式的差異
如下圖:使用函數聲明可正确的輸出結果3,但是用函數表達式定義的函數結果是undefined。
原因是,當JS執行之前。解析器會讀取函數聲明添加到執行環境中。對代碼求值時,JS引擎在第一遍會聲明函數并将它們放到源代碼樹的頂部。就好像先執行了function add(), 然後才執行了 var number = add()。函數被提前了。
同樣的函數表達式也會被提前,也就是var add被提前,但是值是undefined。這裡将undefined像函數那樣去調用就報了“undefined is not a function”。