【问题标题】:Is Function object necessary函数对象是否必要
【发布时间】:2012-04-02 17:18:12
【问题描述】:

创建这样的函数很常见且容易:

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

那么为什么会有函数对象之类的:

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

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

为什么是函数对象?

【问题讨论】:

    标签: javascript function object


    【解决方案1】:

    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}
    

    【讨论】:

    • function factory(ret){ return function(){return ret;};};
    • @onemach 合并了另一个函数表达式。你的问题有什么意义?
    • 你可以对闭包做同样的事情。
    • 能否请您链接您在此回复中引用的任何 TypeScript 文档?
    【解决方案2】:

    函数(大写的 F)不是关键字,它是 JavaScript 中任何其他函数的基类,鉴于 JavaScript 中的 everything 是一个对象,函数应该/必须继承自一个基类,表示所有其他函数(方法/类)的基本功能。

    你可以通过 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 
    

    【讨论】:

    • 没错!大多数内置构造函数(如StringArrayFunction)并不是为了被调用,而是为了扩展。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多