JavaScript函数重新定义

dav*_*k01 15 javascript

是否可以从自己的体内重新定义JavaScript函数.例如,我可以执行以下操作吗?

function never_called_again(args) {
  // Do some stuff
  never_called_again = function (new_args) {
    // Do some new stuff
  }
}
Run Code Online (Sandbox Code Playgroud)

以上是否有效且是否具有正确的语义?我不想用旧的函数名创建一个新的全局变量,因为我试图在全局范围内做这种事情,但是从各种对象范围开始,我不希望当我发生名字冲突时在这些本地范围内重新定义函数.

gbl*_*zex 42

确实可以从其身体重新定义一个功能.该技术用于所谓的惰性函数定义模式.

它看起来像这样:

// Lazy Function Definition Pattern
var foo = function() {
    var t = new Date();
    foo = function() {
        return t;
    };
    return foo();
}
Run Code Online (Sandbox Code Playgroud)

此函数存储第一个调用的日期,然后返回此日期.

如果其与模块模式进行比较,不同之处在于初始化仅在首次调用时发生,而不是在定义时发生.对于昂贵的初始化,它可以是一个巨大的好处.

// Conditional Module Pattern
var foo = (function() {
    var t;
    return function() {
        if (t) {
            return t;
        }
        t = new Date();
        return t;
    }
})();
Run Code Online (Sandbox Code Playgroud)


Bro*_*ams 15

是的,您可以通过这种方式重新定义功能.

运行这个:

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');
Run Code Online (Sandbox Code Playgroud)

收益率:

Func 1 arg A
Func 2 arg A arg B
Run Code Online (Sandbox Code Playgroud)

  • @galambalazs:我给了你荣誉,我扩大了你不满意的方面。另外,我的第一个答案和主要答案与您的无关,足够了。 (2认同)
  • Szia Balázs,这不是社区维基,也不是撒尿比赛。我,Google 员工,该网站 99.99% 的用户,根本不在乎程序中涉及哪些打字或复制粘贴流,从而产生了我认为有用(或废话)的答案。*1.* 我,访客,会经常阅读每一个,并且会对复制粘贴的猴子大声笑。*2.* 作为社区成员,我会为更好的答案投上赞成票——如果一个看起来像另一个,没有增加任何价值,我肯定会选择时间戳较早的那个。所以,不用担心;你可以看到这对你的投票数起作用。;) (2认同)