Javascript 如何在异步加载的HTML元素之间创建信号量

Javascript 如何在异步加载的HTML元素之间创建信号量,javascript,html,semaphore,Javascript,Html,Semaphore,在一个HTML页面中,有一个元素多次出现,并且运行相同的JS。 问题是,我希望它只在第一个运行它时才执行特定的功能(他的兄弟姐妹从未运行过) 我需要信号灯在它们之间同步。 我不知道如何在JS中声明变量和以这种方式进行信号量。有很多方法 你需要在某处挂一面旗子。在没有任何其他内容的情况下,您可以将其置于窗口,但使用的名称不太可能与其他内容冲突 然后JavaScript非常简单: if (!window.myUniqueNameFlag) { window.myUniqueNameFlag

在一个HTML页面中,有一个元素多次出现,并且运行相同的JS。 问题是,我希望它只在第一个运行它时才执行特定的功能(他的兄弟姐妹从未运行过)

我需要信号灯在它们之间同步。
我不知道如何在JS中声明变量和以这种方式进行信号量。

有很多方法

你需要在某处挂一面旗子。在没有任何其他内容的情况下,您可以将其置于
窗口
,但使用的名称不太可能与其他内容冲突

然后JavaScript非常简单:

if (!window.myUniqueNameFlag) {
    window.myUniqueNameFlag = true;
    // Do your processing
}
但是,如果你可以避免的话,把东西放在
窗口上并不理想,尽管这是非常常见的做法。(与在全局范围内声明的任何函数一样,您在全局范围内用
var
imk_声明的任何变量都是
window
的属性。)

如果函数已在全局范围内声明(因此已占用全局标识符/窗口属性),则可以这样做以避免创建第二个标识符。而不是:

function foo() {
    // ...your processing...
}
这样做:

var foo = (function() {
    var flag = false;

    function foo() {
        if (!flag) {
            flag = true;
            // ...your processing...
        }
    }

    return foo;
})();
这看起来很复杂,但实际上并不复杂:它定义并立即调用匿名函数,在匿名函数中定义变量和嵌套函数,然后返回嵌套函数的引用并将其分配给
foo
变量。您可以调用
foo
,您将得到嵌套函数。嵌套函数对
标志
变量有一个持久的引用,因为它是一个变量,但其他人看不到它。这完全是私人的

第三个选项是只在函数对象本身上使用一个标志:

function foo() {
    if (!foo.flag) {
        foo.flag = true;
        // ...do your processing...
    }
 }
函数只是能够被调用的对象,所以您可以向它们添加属性



let
const
在全局范围内声明的变量是全局变量,但不会成为
窗口的属性,它不是原子操作。从理论上讲,这两个元素都可以在分配前通过if条件variable@oshafran:浏览器上的JavaScript保证是单线程的,除非使用新的东西,这需要显式语法。因此,上述内容在浏览器上是原子的。如果您使用的是其他环境,并且该环境是多线程的,那么您将使用该环境提供的同步机制。但是你说这个是基于浏览器的,所以不需要。