我需要创建一个只能执行一次的函数,在第一次执行后,每次都不会执行。我从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”。似乎有对框架的引用,但无法在框架上调用该函数,为什么呢? 问题答案: 采