Javascript 如何在异步加载的HTML元素之间创建信号量
在一个HTML页面中,有一个元素多次出现,并且运行相同的JS。 问题是,我希望它只在第一个运行它时才执行特定的功能(他的兄弟姐妹从未运行过) 我需要信号灯在它们之间同步。Javascript 如何在异步加载的HTML元素之间创建信号量,javascript,html,semaphore,Javascript,Html,Semaphore,在一个HTML页面中,有一个元素多次出现,并且运行相同的JS。 问题是,我希望它只在第一个运行它时才执行特定的功能(他的兄弟姐妹从未运行过) 我需要信号灯在它们之间同步。 我不知道如何在JS中声明变量和以这种方式进行信号量。有很多方法 你需要在某处挂一面旗子。在没有任何其他内容的情况下,您可以将其置于窗口,但使用的名称不太可能与其他内容冲突 然后JavaScript非常简单: if (!window.myUniqueNameFlag) { window.myUniqueNameFlag
我不知道如何在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保证是单线程的,除非使用新的东西,这需要显式语法。因此,上述内容在浏览器上是原子的。如果您使用的是其他环境,并且该环境是多线程的,那么您将使用该环境提供的同步机制。但是你说这个是基于浏览器的,所以不需要。