当前位置: 首页 > 面试题库 >

JavaScript中的函数只能调用一次

荀子轩
2023-03-14
问题内容

我需要创建一个只能执行一次的函数,在第一次执行后,每次都不会执行。我从C++和Java知道可以完成此工作的静态变量,但我想知道是否有更优雅的方法来做到这一点?


问题答案:

如果用“将不执行”来表示“多次调用将不执行任何操作”,则可以创建一个闭包:

var something = (function() {
    var executed = false;
    return function() {
        if (!executed) {
            executed = true;
            // do something
        }
    };
})();

something(); // "do something" happens
something(); // nothing happens

使用全局变量,其他代码可以重置“已执行”标志的值(无论您为它选择什么名称)。使用闭包时,其他代码都无法做到这一点,无论是偶然还是故意的。

正如这里的其他答案所指出的那样,几个库(例如Underscore和Ramda)都有一个小的实用程序函数(通常名为once()[*]),该函数接受一个函数作为参数并返回另一个函数,该函数仅调用一次所提供的函数,而无论如何多次调用返回的函数。返回的函数还会缓存所提供的函数首先返回的值,并在后续调用中返回该值。

但是,如果您不使用这样的第三方库,但仍然想要这样的实用程序功能(而不是我上面提供的现成的解决方案),则很容易实现。我见过的最好的版本是DavidWalsh发布的这个版本:

function once(fn, context) { 
    var result;
    return function() { 
        if (fn) {
            result = fn.apply(context || this, arguments);
            fn = null;
        }
        return result;
    };
}

我倾向于更改fn = null;fn=context=null;。有没有理由,关闭,保持一个参考context一旦fn被调用。

[*]
但是,请注意,其他库(例如jQuery的Drupal扩展)可能具有名为的函数once(),该函数的功能完全不同。



 类似资料:
  • 确保函数只被调用一次。 使用一个闭包,使用一个成为 called 的标志,并在第一次调用该函数时将其设置为 true ,以防止它被再次调用。 为了允许函数改变它的 this 上下文(比如在一个事件监听器中),必须使用function 关键字,并且提供的函数必须应用上下文。 允许使用 rest(剩余)/spread(展开) (...) 运算符为函数提供任意数量的参数。 const once = fn

  • 我定义了一个名为marger的函数来查找两个参数(num1、num2)之间的较大数。现在,我想在另一个名为“最大”的函数中使用这个函数,这个函数获得一个数组并返回该数组的最大个数,但我被卡住了。有人能帮我吗?下面是我的代码:

  • 问题内容: 有些事情像 但是,这是 在这种情况下,“ 1”似乎没有多大意义,以下工作正常: 您能否指向ECMAScript的描述该语法的特定部分? 问题答案: 此运算符仅从左至右求值其操作数,并从第二个运算符返回值,例如: 在调用函数的上下文中,对操作数的求值将仅获取一个值,而不是引用,这将导致被调用函数内部的值指向全局对象(或者它将处于新的ECMAScript5 Strict模式下) 。 例如:

  • 我需要使用thymeleaf从html调用一个javascript函数。在这个特定的例子中,我有一个student对象,我需要将这个student对象传递给javascript函数(edit())以便在单击按钮时进行处理。 重要代码段:

  • 问题内容: 我想知道是否有可能仅在条件为真时在javascript中调用php函数。例如 有没有这样做的方法。如果是这样,请告诉我。谢谢 问题答案: 不能以上面说明的方式调用PHP函数。但是,您可以使用AJAX调用PHP脚本,代码如下所示。您也可以在这里找到一个简单的示例。让我知道您是否需要进一步澄清 使用jQuery 准系统Javascript替代

  • 问题内容: 我在从父页面调用JavaScript函数时遇到问题。这是我的两页: mainPage.html resultFrame.html (我知道不建议这样做,但只能在内部使用IE浏览此页面,我不认为这是问题所在) 当我按下“重置”按钮时,我得到“找到resultFrame”和“找不到resultFrame.Reset”。似乎有对框架的引用,但无法在框架上调用该函数,为什么呢? 问题答案: 采