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 ...导致控制台.log以输出人B的ID而不是人A的ID。

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

最佳答案

是的,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根本没有关系。

关于javascript - 这是Node.js中正确的代码吗? (可变范围),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6590643/

10-16 19:57