JS比較3種函數的作用域

2020-07-16 10:05:10
在《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 及以上
形式 句子 表示式 表示式
名稱 有名 匿名 匿名
主體 標準語法 字串 標準語法
性質 靜態 動態 靜態
解析 以命令的形式構造一個函數 解析函數體,能夠動態建立一個新的函數物件 以表示式的形式構造一個函數物件
作用域 具有函數作用域 頂級函數,具有頂級作用域 具有函數作用域