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 */ 
    }
}