Function对象很常见,可以轻松地创建功能,如:是必要的
var f = function(){
alert("something");
};
那么,为什么会出现Function对象,如:
var f = new Function("alert('something');");
后者是很难读/写。我只能想出一种情况,有人在网页上输入一些JS代码并运行它。这也可以通过eval
来解决。
为什么函数对象?
Function对象很常见,可以轻松地创建功能,如:是必要的
var f = function(){
alert("something");
};
那么,为什么会出现Function对象,如:
var f = new Function("alert('something');");
后者是很难读/写。我只能想出一种情况,有人在网页上输入一些JS代码并运行它。这也可以通过eval
来解决。
为什么函数对象?
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}
中的作用(有资本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
准确!大多数内置的构造函数(比如'String','Array','Function')不打算被调用,而是被扩展。 – georg 2012-03-17 13:17:09
'function factory(ret){return function(){return ret;};};' – onemach 2012-03-17 11:21:20
@onemach合并另一个函数表达式。你的问题有什么意义? – 2012-03-17 11:23:15
你可以用闭包来做同样的事情。 – Gumbo 2012-03-17 11:23:24