回调中的Javascript变量范围

时间:2013-06-24 10:47:07

标签: javascript scope

我正在使用formidablegithub),我不确定回调中某些变量的范围。 我的部分代码是:

UploadHandler.prototype.upload = function(req, res){
    var query = url.parse(req.url, true).query;
    var form = new formidable.IncomingForm();
    var id = query['X-Progress-ID'];

    self.uploads.add(id);

    form.parse(req, function(err, fields, files){
        self.uploads.remove(id);
        res.writeHead(200, { 'Content-type': 'text/plain' });
        return res.end('upload received');
    });

    ...

}

我的问题是,在id的回调中,parse的价值是多少?此外,如果超过1个人上传文件,该代码是否会按预期工作? (如果他们同时使用上传者,id会改变第一个和第二个人的价值。

1 个答案:

答案 0 :(得分:2)

id是您定义的内容,是的,如果有多个upload调用,它将起作用:id变量是调用upload的本地变量功能。这里的范围是函数调用,它形成了所谓的closure

以下是您的代码的简化版本:

function upload(i){
   var id=i; // id is local to the invocation of upload
   setTimeout(function(){ console.log(id) }, 100*i);
}
for (var i=0; i<3; i++) {
    upload(i);
}

记录0, 1, 2