JavaScript Function

admin發表於2018-11-17

我們說JavaScript是物件導向的語言,基本做到一切皆是物件。

通過建構函式可以建立物件例項,程式碼如下:

[JavaScript] 純文字檢視 複製程式碼
function Antzone(){
  // code
}  
let ant=new Antzone()

上述程式碼通過建構函式Antzone建立一個物件例項ant。

關於建構函式更多內容可以參閱JavaScript 建構函式一章節。

既然一切皆為物件,那麼function函式也不例外,由Function建構函式建立。

那麼問題來了,Function又是由誰建立的,Function是由Function建立。

因為Function也是一個function函式,看起來關係有點亂,程式碼如下:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
Function instanceof Function

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201811/23/110529qoktsdzwh55n5wkj.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

這不是本文要關注的,更多內容參閱JavaScript instanceof一文底部繼承關係圖。

語法結構:

[JavaScript] 純文字檢視 複製程式碼
let function_name = new function(arg1, arg2, ..., argN, function_body)

通過Function建構函式可以建立function函式物件。

原本用來建立其他物件例項的function,現在成為Function建構函式的物件例項。

特別說明:注意F的大小寫。

引數解析:

(1).arg1..argN:被建立函式的形式引數。

(2).function_body:被建立函式體中的程式碼。

程式碼例項如下:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let func=new Function("a","b","let num=a+b;return num;")
console.log(func(2,3));

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201811/17/104351qtzt79uu0ijuohty.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

程式碼分析如下:

(1).Function前兩個引數"a"與"b"是建立函式的兩個形式引數a與b。

(2).Function最後一個引數是新建立函式的函式體部分,也就是大括號中的內容。

上述程式碼建立的函式等價於如下程式碼:

[JavaScript] 純文字檢視 複製程式碼
let func=function(a,b){
  let num=a+b;
  return num;
}

實際應用中不推薦使用Function建構函式建立function函式。

原因主要有如下兩點:
(1).建立過程複雜,函式宣告或者表示式方式建立方式更加清晰便捷。

(2).效率不高。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let func=Function("a","b","let num=a+b;return num;")
console.log(func(2,3));

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201811/17/104437e9dihzvojjccxpoa.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

可以看到Function前面並沒有加關鍵字new。

但是依然可以建立一個函式物件,與加new關鍵字效果完全一樣。

關於new的作用可以參閱JavaScript new 運算子一章節。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let b=5;
function createF(){
  let b=2;
  let func=new Function("a","console.log(a+b)");
  func(1);
}
createF();

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201811/17/104542nhy23cz2ahw2yar4.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

程式碼分析如下:

(1).在函式createF內通過Function建立函式並賦值給func。

(2).呼叫func函式後,列印結果是5。

(3).由列印結果可見,func函式在全域性作用域查詢超找變數,而不是在宣告它的函式作用域。

相關文章