Javascript 仅当函数没有';一个函数不能被调用/运行一次
我在我的网站的一些页面上运行了一个函数Javascript 仅当函数没有';一个函数不能被调用/运行一次,javascript,Javascript,我在我的网站的一些页面上运行了一个函数animate_images,可以执行特定的动画 我遇到的问题是,当用户再次导航到同一页面时,除了已经运行的实例之外,还会再次调用该函数 有没有办法做到这一点: if ! (animate_images) { animate_images(); } function a(){ console.log("hello"); a = function(){}; } var obj { b:a }; a(); //"hello" a();
animate_images
,可以执行特定的动画
我遇到的问题是,当用户再次导航到同一页面时,除了已经运行的实例之外,还会再次调用该函数
有没有办法做到这一点:
if ! (animate_images) {
animate_images();
}
function a(){
console.log("hello");
a = function(){};
}
var obj { b:a };
a(); //"hello"
a(); //>>nothing happens<<
obj.b(); //"hello"
本质上,我想确保无论实际调用多少次,
animate_images
都不会运行多次 看看subline.js中的once
函数
本质上,您将函数包装在另一个函数中,其中包含一个标志变量。如果该标志未设置,则调用该函数,并在调用时设置该标志
_.once = function(func) {
var ran = false, memo;
return function() {
if (ran) return memo;
ran = true;
memo = func.apply(this, arguments);
func = null;
return memo;
};
})
如果您不想在网站中添加下划线(我认为这是启动任何网站时应该做的第一件事,但我离题了),请执行以下操作:
runOnlyOnce = function(func) {...} // As defined above
animate_images = runOnlyOnce(animate_images);
或
函数本身不依赖于下划线的其余部分 执行后,可以使用空函数覆盖函数:
function a(){
console.log("hello");
a = function(){};
}
a(); //"hello"
a(); //>>nothing happens<<
此方法将失败。使用函数对象的静态属性,如在布尔
图像动画中。正在运行。在animate_images
的开始处,使用以下内容封装动画初始化
animate_images() {
// on first load, animate_images.isRunning is undefined,
// so (!animate_images.isRunning) returns true.
if(!animate_images.isRunning) {
/* launch animation */;
// define animate_images.isRunning and assign true
animate_images.isRunning = true;
} else {
/* animation already initialized */
}
}
您可以尝试使用全局布尔函数,当用户加载另一个页面或重新加载同一个页面时,该函数如何仍在运行?您可以添加一个is\u running
属性,在animate\u images()的开头将其设置为true
函数,然后设置为false
每当间隔/超时被清除/动画停止时。我喜欢Paulpro的想法,但无论你做什么,请不要使用全局布尔值。一旦你开始这样做,你的整个应用程序就会在全局状态下运行。是的,如果你知道函数将不会被实例化超过一次(不使用new
),那么你可以使用函数对象的“静态”属性,如在动画图像中。函数正在运行吗。我记不起来了——从技术上讲,这可能会使图像动画化。运行的是全局的(或与运行的在同一范围内),而不是实际上是运行的的属性,但效果应该是相同的。如果您正在使用new
实例化animate_图像
,那么您将使用this
。Javascript中的IIRC这个
的作用域是“最近的”函数实例。谢谢,@Sudhir–有没有一种方法可以做到这一点,而无需在我已经很满的库的网站上添加额外的JS库?是的,只需重写这个函数并给它起一个你喜欢的名字。请在你发布的函数中添加我函数的占位符,@SudhirJonathan?我对JavaScript非常陌生,甚至这也是一个挑战。它应该在返回备忘录之后吗?
?或者可能我误解了您,当调用runonlynce
函数时,我只需要将函数放在括号中,如您所示?是的,您也可以这样做:animate_images=runonlynce(function(){alert('images Animated');})代码>
animate_images() {
// on first load, animate_images.isRunning is undefined,
// so (!animate_images.isRunning) returns true.
if(!animate_images.isRunning) {
/* launch animation */;
// define animate_images.isRunning and assign true
animate_images.isRunning = true;
} else {
/* animation already initialized */
}
}