天天看點

JS學習 函數的了解

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”。