Javascript 的工作方式与 PHP 不同。范围的行为是完全不同的,并且是防止问题成为问题的原因。
现实世界的类比是假设您有许多工作台排成一列。你的老板进来,在长凳上放了一些要处理的东西。当你在处理它时,他会在其他长凳上放置更多物品。
在某个时间点,您到达 1 号桌的停靠点,您将不得不等待。您移动到 2 号办公桌开始在那里工作。一旦你看到 #1 号桌再次准备就绪,你就去 #1 号桌继续工作。由于您的办公桌完全不同,因此很难混淆。你只需要记住不要随身携带东西。 Node 中的每个函数都有完全不同的作用域,这使得 node 很难混淆它正在做什么。
function object_init() { this.a = 'a'; return this }
function server_resp(req, res) {
var obj = object_init();
if ( req.changeTrue() ) {
obj.a = 'b';
}
function test() {
longOperation();
console.log( obj.a );
}
test()
}
上面的 sn-p 是 Node.js 应用程序中可能发生的非常高级别的正常 sn-p。大多数 javascript 应用程序都会有一个与此非常相似的 sn-p 代码。
您担心的是,在 longOperation() 之后,Node 将返回到错误的 server_resp 实例。它没有发生的原因是因为每个请求都有自己的“板凳”。 Node 足够聪明,可以从一个长凳移动到另一个长凳,而无需将物品从一个长凳移动到另一个长凳。 Node 的工作是执行不进位。每个“长凳”都有自己的 obj。每个“长凳”甚至都有自己的 test()。这就是 Javascript 的工作方式,因为函数与对象密切相关。
PHP 具有与 javascript 完全不同的内存和执行模型,这就是为什么 javascript 可以安全地做到这一点。 PHP 更程序化/OOP,而 javascript 更具有功能性。
这是对节点如何工作的一般解释。表面之下可能潜伏着安全漏洞。根据内存模型和大小检查,整数溢出可能会重写内存库,并使攻击者能够访问他们以前无法访问的范围。糟糕的代码可能会扩大这个漏洞。对于普通代码,不同请求之间的混淆几乎是不可能实现的。