gpt4 book ai didi

javascript - Javascript 中是否存在 "unsafe publication"?

转载 作者:行者123 更新时间:2023-11-29 21:16:42 25 4
gpt4 key购买 nike

我刚刚写了下面的 Javascript 代码...

class Team {
constructor(id, eventHandler) {
this.id = id;
this._eventHandler = eventHandler;
this._eventHandler.trigger("NewTeam", this); // my concerning line
}
}

我有 Java 背景。在 Java 中,对象从其构造函数共享对自身的引用被认为是危险的(“不安全发布”)。这是因为其他线程可能会在对象处于有效状态之前对该对象进行操作。

它在 Javascript 中也有风险吗?这被认为是不好的做法吗?

我只能想到一个问题:如果我们想扩展Team那么要使 eventHandler.trigger("NewTeam",__) 可见其他属性就很棘手了.

最佳答案

由于 Javascript 是单线程的(webWorkers 除外,这里没有发挥作用),您提到的 Java 问题不适用于 Javascript。没有其他代码会与构造函数同时运行。这是对 Javascript 的单线程和事件驱动特性的极大简化之一。

如果您同步触发事件或进行函数调用并将未完成的对象传递给该事件处理程序或函数调用,那么您当然是在自找麻烦,因为您会将未完成的对象引用传递给其他代码将在您完成构造函数之前运行。

只要你传递的对象在你传递的时候是有效状态,这不是问题,但是如果你传递的是一个未完成的对象,那你确实是在自找麻烦,但这真的只是常识编程,与线程或并发无关。


在您的具体情况下:

class Team {
constructor(id, eventHandler) {
this.id = id;
this._eventHandler = eventHandler;
this._eventHandler.trigger("NewTeam", this); // my concerning line
}
}

您创建了一个漏洞。如果 Team 是子类,那么您将调用 this._eventHandler.trigger("NewTeam", this); 并在子类必须完成其构造函数。根据具体的实现,这可能是一个问题,因此实践并不总是安全的。如果 .trigger() 可以在下一次报价时调用(使用类似 setImmediate()nextTick() 的方法,那么它总是是安全的,因为对象和任何子类总是在调用之前完成构造。

关于javascript - Javascript 中是否存在 "unsafe publication"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39156494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com