函數構造器(Function constructor)
函數構造器用於創建一個函數對象,在JavaScript中實際上每一個函數都是一個函數對象。
函數構造器的語法:
new Function ([arg1[, arg2[, ...argN]],] functionBody)
arg1, arg2, ... argN 被用於作為函數正常參數名的變量名字,這些變量名必須是符合JavaScript變量標識規范的表示單個變量的字符串或者以逗號分隔的表示多個變量的字符串,比如"x", "theValue", or "a,b"。
functionBody 包含函數定義的JavaScript語句的字符串。
描述
1.函數對象在函數構造器被解析成為函數的時候被創建。但是這樣會比以函數聲明、函數表達式等方式低效,因為這些函數時通過代碼直接解析的。
2.傳遞給函數構造器的字符串參數都會被當作函數構造器生成函數的變量參數名字,以他們出現的順序作為生成的函數的參數的順序。
3.以函數的方式調用函數構造器(不管用不用new關鍵詞修飾)效果一樣。
例子
// Example can be run directly in your JavaScript console // Create a function that takes two arguments and returns the sum of those arguments var adder = new Function('a', 'b', 'return a + b'); // Call the function adder(2, 6); // > 8
參數a和b是可以在函數體內使用的正常的參數名字。
生成的函數為:function (a,b){
return a+b;
}
關於json解析的一種方式:var json = (new Function("return " + str))();
原理一樣,
生成的函數為:
function toJson(str){
return str;
}
var str="{'a':1,'b':'abc'}";
toJson(str);
即:function(){return {'a':1,'b':'abc'}}
函數構造器和函數聲明的區別:
用函數構造器創建的函數不會在上下文中創建閉包,它們總是被創建在全局作用域中,當執行被創建的函數時,它們只能使用自己的局部變量或者全局變量,這和eval是不同的。
var x = 10; function createFunction1() { var x = 20; return new Function("return x;"); // this |x| refers global |x| } function createFunction2() { var x = 20; function f() { return x; // this |x| refers local |x| above } return f; } var f1 = createFunction1(); console.log(f1()); // 10 var f2 = createFunction2(); console.log(f2()); // 20
參考文獻:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function
