在《JS函數定義》一節中,我們講到了 3 種建立函數的方法,分別是:使用 function 語句、使用 function 表示式和使用 Function 建構函式。
下面分別使用這 3 種方法定義一個空函數:
function f() {}
var f = function () {}
var f = new Function()
通過這 3 種方法建立的函數物件的 [[scope]] 屬性值會有所不同,進而影響函數執行過程中的作用域鏈。
-
使用 function 語句的函數物件是在進入執行上下文時的變數初始化過程中建立的。該物件的 [[scope]] 屬性是它被建立時的執行上下文對應的作用域鏈。
-
使用 function 表示式定義的函數物件是在該表示式被執行的時候建立的的。該物件的 [[scope]] 屬性值與使用 function 宣告建立的物件一樣。
-
使用 Function 構造器宣告一個函數通常使用兩種方式。常用格式是 var funcName = new Function(p1,p2,...,pn,body),其中 p1,p2,...,pn 表示的是該 function 的形式引數,body 是 function 的內容。使用該方式的 function 物件是在構造器被呼叫的時候建立的。該物件的 [[scope]] 屬性值總是一個只包含全域性物件的作用域鏈。
這 3 中方法的詳細比較如表所示。
函數定義方法比較
函數定義方法 |
使用 function 語句 |
使用 Function() 建構函式 |
使用函數表示式 |
相容 |
完全 |
JavaScript 1.1 及以上 |
JavaScript 1.2 及以上 |
形式 |
句子 |
表示式 |
表示式 |
名稱 |
有名 |
匿名 |
匿名 |
主體 |
標準語法 |
字串 |
標準語法 |
性質 |
靜態 |
動態 |
靜態 |
解析 |
以命令的形式構造一個函數 |
解析函數體,能夠動態建立一個新的函數物件 |
以表示式的形式構造一個函數物件 |
作用域 |
具有函數作用域 |
頂級函數,具有頂級作用域 |
具有函數作用域 |