[英]Javascript: calling function only once
这是一段代码:
if (lastPosition == 0) {
callsomemethod(param);
}
我有这种奇怪的情况,我必须调用函数callsomemethod(param); 即使if条件为真不止一次。 换句话说,我想确保即使if语句为true,函数callsomemethod只会被调用一次。 在if语句中还有更多的事情发生,为了简单起见,我将它们删除了。
编辑::感谢您的所有答复。 不幸的是,这种方法都不起作用,因为if语句位于函数内部,并且该函数被多次调用,因此所有内容均再次初始化。 该功能也位于IIFE内部。 抱歉在第一枪中没有将所有内容弄清楚。
提前致谢
惯用的方法是使用锁变量,可以选择通过闭包将其隐藏。 最简单的示例是:
var done = false;
function callOnce(lastPosition) {
if (lastPosition == 0 && !done) {
done = true;
callSomeMethod(lastPosition);
}
}
要产生只能被调用一次的函数,可以使用闭包并将其包装:
function wrapOnce(fn) {
var done = false;
return function (...args) {
if (!done) {
done = true;
return fn.apply(this, args);
}
}
}
( ...args
语法可能在较旧的浏览器中不起作用,应替换为代码以验证arguments
并将其传递给我,为了简洁起见,我省略了该语法)
这是lodash曾经的助手的基础。
由于JS只允许单个线程访问变量,因此它本质上是线程安全的(如适用),并且如果多个回调尝试使用once
标准化的方法也不会中断。
添加一个标记以跟踪该函数是否先前被调用过:
var wasCalled = false;
// ...
if (lastPosition == 0) {
if(!wasCalled) {
wasCalled = true;
callsomemethod(param);
}
}
更高级的是,利用闭包来包装整个东西:
var callsomemethod = (function(){
var wasCalled = false;
return function(param){
if(wasCalled){
return;
}
else {
wasCalled = true;
}
// callsomemethod()'s inner code goes here
};
})();
声明一个全局变量var ran = false,在callsomething方法中将其设置为true,并扩展if:
if(lastposition==0 && ran==false)
{
callsomemethod(param);
}
你可以有一个布尔叫called
你设置为true,当你调用该方法的第一次:
var called = false;
if (lastPosition == 0) {
if(!called){
callsomemethod(param);
called = true;
}
}
这是另一种类似于先前响应的方式。 您可以使用Function原型添加一次调用行为。 在下面的代码中,只有第一次调用才能打印结果。
function callSomeMethod(param){
console.log('called...'+param);
};
Function.prototype.onlyOnce = function(param){
if(!this.wasCalled && this == callSomeMethod){
this(param);
this.wasCalled = true;
}
};
function outerMethod(){
callSomeMethod.onlyOnce('foo');
callSomeMethod.onlyOnce('bar');
}
outerMethod();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.