我正在阅读关于私人/受保护成员的article"仿真" 使用javascript(我知道它不是最佳实践,但用于研究目的)
例如,在此代码中我们已经
var Class = (function() { // Open closure
var caller = null;
//[...]
var mayAccessWrapped = false;
function wrapmethod(method) {
mayAccessWrapped = true;
if (method.__getWrappedMethod) {
method = method.__getWrappedMethod();
}
mayAccessWrapped = false;
var wrapped = function wrapper() {
var prevCaller = caller;
caller = wrapper;
var returns;
try {
returns = method.apply(this, arguments);
}
finally {
caller = prevCaller;
}
return returns;
};
wrapped.__getWrappedMethod = function() {
if (mayAccessWrapped) { return method; }
throw "Error: only the wrapping function may access the wrapped method";
}
return wrapped;
}
//[...]
return Class;
})(); // End Class closure

"包裹"方法在同一个对象中多次使用,它使用调用者变量来"注入"关于"来电者的信息"与"叫"方法(alternative to deprecated arguments.callee)。
但是,在并发作用域中,这种方式是否安全?是否有可能另一种方法可以更改调用者变量的值,从而使数据一致性失效?
答案 0 :(得分:1)
如果字面上表示"线程安全,"我认为第一个问题必须是......你的JavaScript解释器是否是线程安全的? 允许两个或多个线程拥有自己的解释器上下文吗? 设计是否具有必要的内部互斥机制,以允许两个或多个线程同时访问解释器的内部上下文/状态? (如果是这样,你是否按照规定的方式完全使用这些设施?)
如果没有,你的程序肯定会崩溃。线程将最终在解释器的内部状态上涂鸦,并且"向下走。"