是必需的功能对象

时间:2012-03-17 11:14:20

标签: javascript function object

创建以下功能很常见且很容易:

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

那么为什么功能对象就像:

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

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

为什么选择Function对象?

2 个答案:

答案 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