2012-03-17 127 views
7

Function对象很常见,可以轻松地创建功能,如:是必要的

var f = function(){ 
    alert("something"); 
}; 

那么,为什么会出现Function对象,如:

var f = new Function("alert('something');"); 

后者是很难读/写。我只能想出一种情况,有人在网页上输入一些JS代码并运行它。这也可以通过eval来解决。

为什么函数对象?

回答

13

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} 
+0

'function factory(ret){return function(){return ret;};};' – onemach 2012-03-17 11:21:20

+0

@onemach合并另一个函数表达式。你的问题有什么意义? – 2012-03-17 11:23:15

+0

你可以用闭包来做同样的事情。 – Gumbo 2012-03-17 11:23:24

3

中的作用(有资本F)不是关键字,它是JavaScript中所有其他函数的基类,因为在JavaScript中,的所有内容都是是一个对象,函数应该/必须从代表所有其他函数的基本功能的基类继承/类)。

您可以通过函数的原型打太多的功能继承:

这里有一个例子,JS定义的所有功能。运行方法:

Function.prototype.run = function (delay) { 
    setTimeout(this, delay); 
}; 

测试:

function test(){console.log("test")}; 
test.run(2000); 

有一个无证的__proto__属性指向基类原型,你可以在函数的每个实例上检查它:

test.__proto__ == Function.prototype; // true 
+0

准确!大多数内置的构造函数(比如'String','Array','Function')不打算被调用,而是被扩展。 – georg 2012-03-17 13:17:09