JavaScript函数重定义

新手上路,请多包涵

是否可以从其自身内部重新定义 JavaScript 函数。例如,我可以执行以下操作吗?

 function never_called_again(args) {
  // Do some stuff
  never_called_again = function (new_args) {
    // Do some new stuff
  }
}

以上是否有效,是否具有正确的语义?我不想用旧的函数名创建一个新的全局变量,因为我不是在全局范围内而是在各种对象范围内尝试做这种事情,而且我不希望名称冲突在这些本地范围内重新定义函数。

原文由 David K. 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 432
2 个回答

是的,你可以那样重新定义一个函数。

运行这个:

 function never_called_again(args) {
    console.log('Func 1', args);

    never_called_again = function (new_args, x) {
        console.log('Func 2', new_args, x);
    }
}

never_called_again('arg A', 'arg B');

never_called_again('arg A', 'arg B');


产生这个:

 Func 1 arg A
Func 2 arg A arg B

原文由 Brock Adams 发布,翻译遵循 CC BY-SA 2.5 许可协议

确实 可以 从函数体中重新定义函数。该技术用于所谓的 惰性函数定义模式

它看起来像这样:

 // Lazy Function Definition Pattern
var foo = function() {
    var t = new Date();
    foo = function() {
        return t;
    };
    return foo();
}

此函数存储第一次调用的日期,并在之后返回此日期。

如果将其与 模块模式 进行比较,区别在于初始化仅在首次调用时发生,而不是在定义时发生。对于 代价高昂的初始化 来说,这可能是一个巨大的 好处

 // Conditional Module Pattern
var foo = (function() {
    var t;
    return function() {
        if (t) {
            return t;
        }
        t = new Date();
        return t;
    }
})();

原文由 gblazex 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏