创建以下功能很常见且很容易:
var f = function(){
alert("something");
};
那么为什么功能对象就像:
var f = new Function("alert('something');");
后者很难写/读。我只能提出一种情况,即有人在网页上键入一些JS代码并运行它。这也可以通过eval
来解决。
为什么选择Function对象?
答案 0 :(得分:14)
Function
对象可用于动态生成函数。
var some_fixed_value = 1;
var f = new Function("return " + some_fixed_value);
反对:
var some_fixed_value = 1;
var f = function() {
return some_fixed_value;
};
// Break the function logic:
some_fixed_value = 'not_fixed_any_more!';
或使用两个函数表达式:
var f = (function(copy_of_fixed_value) {
return function() {
return copy_of_fixed_value;
};
})(some_fixed_value);
“这也可以通过eval
”来解决:
var func_func = new Function('x', 'return x'); //function anonymous(x){return x}
var evil_func = eval('function(x){return x}'); //SyntaxError: function statement
// requires a name
var eval_func = eval('(function(x){return x})');//function(x){return x}
答案 1 :(得分:3)
函数(使用大写字母F)不是关键字,它是JavaScript中任何其他函数的基类,因为JavaScript中的所有是一个对象,函数应该/必须继承自一个基类,表示所有其他函数(方法/类)的基本功能。
你可以通过Function的原型玩很多函数继承:
这是为JS中的所有函数定义.run方法的示例:
Function.prototype.run = function (delay) {
setTimeout(this, delay);
};
试验:
function test(){console.log("test")};
test.run(2000);
有一个未记录的__proto__
属性指向基类原型,你可以在每个函数实例上检查它:
test.__proto__ == Function.prototype; // true