Javascript 当创建一个只运行一次的函数时,是否应该在函数之前或之后进行重新定义?

Javascript 当创建一个只运行一次的函数时,是否应该在函数之前或之后进行重新定义?,javascript,function,design-patterns,Javascript,Function,Design Patterns,我希望函数只运行一次。我在这里找到了投票率最高的示例,它们重新定义了函数,然后执行本应运行一次的代码。我确信这样做是有充分理由的,而不是运行代码然后重新定义函数,但我不知道那会是什么。我的第一反应是只在代码运行后重新定义函数,因为这看起来“更安全”,因为代码必须在重新定义之前运行 有人能解释一下为什么约定似乎首先要重新定义吗?看来主要原因是多线程语言。如果一个函数应该只运行一次,并且在第一个实例完成之前第二次调用它,则会导致多次调用。首先重新定义它意味着函数不能运行两次。基本上,如果要避免函数被

我希望函数只运行一次。我在这里找到了投票率最高的示例,它们重新定义了函数,然后执行本应运行一次的代码。我确信这样做是有充分理由的,而不是运行代码然后重新定义函数,但我不知道那会是什么。我的第一反应是只在代码运行后重新定义函数,因为这看起来“更安全”,因为代码必须在重新定义之前运行


有人能解释一下为什么约定似乎首先要重新定义吗?

看来主要原因是多线程语言。如果一个函数应该只运行一次,并且在第一个实例完成之前第二次调用它,则会导致多次调用。首先重新定义它意味着函数不能运行两次。

基本上,如果要避免函数被“调用”两次,在第一次调用后立即禁用函数是最安全的做法。当调用和禁用程序之间没有其他事情发生时,也不会发生意外情况。如果要先运行只应执行一次的代码,可能会发生各种情况:

    >代码递归地调用函数,或通过回调-应该考虑
  • 代码确实会引发异常
  • 代码
    提前返回
    s
在任何一种情况下,甚至更多的情况下,都不会达到禁用代码,可能会进行第二次调用


还请注意,仅替换该函数是不够的。调用者可以很容易地创建一个别名变量,该变量仍然保存原始函数,不受将其他变量设置为noop函数的影响。您始终需要将此解决方案与中的“静态布尔变量”方法相结合,除非您控制调用代码并知道它的作用。

请在问题中添加相关的语言标记。如果您谈论的是
javascript
,则没有区别,因为没有线程-只有单个事件循环,不能从多个线程同时调用函数,只能按顺序调用。阅读更多关于js中事件循环的信息,以防止它在多线程环境中多次运行。有道理!是的,我正在使用JavaScript,但我认为这是一个一般性的问题,所以我就不提了。我添加了JS标记,因为它的广泛使用,尽管这个问题适用范围更广。感谢回复。JS不是多线程的。同样,在多线程语言中,尽快禁用可能会减少出现争用情况的机会,但为了获得合适的解决方案,需要一个信号量或原子操作。我没有说JS是多线程的。正如在对原始问题的评论中所述,对于JS来说,顺序无关紧要。我在回答我自己的问题,这样其他任何发现这个问题的人都会有理由首先重新定义函数。