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

时间:2011-07-06 01:34:08

标签: 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);
});

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

当用户使用其ID访问该页面时,console.log(uuu)会输出正确的ID吗?我担心(关于变量范围)是当人A点击页面并经过processUserObject时,可能需要很长时间,在此期间B人点击页面并且更改uuu < /strong>...resulting在console.log中输出人B的ID而不是人A的ID。

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

1 个答案:

答案 0 :(得分:5)

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

var uuu = req.params.userid;

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

uuu = req.params.userid;

然后您将在全局 req.params.userid中捕获uuu值,并且每个回调都共享相同的uuu 你有通常的关闭问题。

function(user_object) { ... }

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

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