这是Node.js中的正确代码吗?(变量范围)

TIM*_*MEX 1 javascript oop node.js

function user(req,res){
    var uuu = req.params.userid;
    processUserObject(uuu, function(user_object){ //This could take a long time...
        console.log(uuu); 
        res.send(JSON.stringify(user_object));
    });
};
app.get('/:userid',function(req,res){
    user(req,res);
});
Run Code Online (Sandbox Code Playgroud)

首先,假设该网站获得了大量的点击.(每秒数千!)

当用户使用他的ID点击页面时,会console.log(uuu)输出正确的ID吗?我担心的(关于变量范围)是当人A点击页面并通过时processUserObject,可能需要很长时间,在此期间B人员点击页面并更改uuu ...导致console.log到输出人B的ID而不是人A的ID.

旁注:我有这种担心,因为当我刚接触Node.js时,我忘了用一些变量初始化var.当我的网站获得大量点击时,我的用户注意到他们从其他用户的点击中获取信息...哎哟.

mu *_*ort 5

是的,console.log(uuu)将记录正确的值.当你这样说:

var uuu = req.params.userid;
Run Code Online (Sandbox Code Playgroud)

您正在捕获req.params.userid局部变量中的当前值,uuu然后uuu由回调闭包捕获.但是,如果你不小心这样做了:

uuu = req.params.userid;
Run Code Online (Sandbox Code Playgroud)

然后你将捕获全局中req.params.userid值,并且每个回调将共享相同的内容,并且您将遇到常见的闭包问题.你的每一个 uuuuuu

function(user_object) { ... }
Run Code Online (Sandbox Code Playgroud)

匿名函数是具有各自独立uuu变量的独立且不同的实体(假设您说var uuu而不是uuu当然).

顺便说一句,如果你最终得到每秒十亿次请求,过度工作的CPU的热量将融化这个世界和下一个世界之间的隔离墙,从而释放出来的R'lyeh的老神.如果发生这种情况,uuu根本不重要.