2

我正在尝试重新使用user在以下函数中命名的变量:

UserModel.prototype.authenticate = function (doc, callback) {

    // check to see if the username exists
    this.users.findOne({ username: doc.username }, function (err, user) {

        if (err || !user)
            return callback(new Error('username not found'));

        // hash the given password using salt from database
        crypto.pbkdf2(doc.password, user.salt, 1, 32, function (err, derivedKey) {

            if (err || user.password != derivedKey)
                return callback(new Error('password mismatch'));

            // explicitly define the user object
            var user = {

                _id: user._id,
                type: user.type,
                username: user.username,
                displayname: user.displayname

            };

            return callback(err, user);

        });

    });

};

我尝试重新定义回调函数user内部的变量。pbkdf2这不像我预期的那样工作。我比较user.password != derivedKey中断的行,因为user在运行时此处未定义。不应该user仍然是findOne回调方法参数中的实例吗?如果我将两个user变量中的任何一个更改为其他变量,它就会起作用。

我可以重命名变量,但这仍然让我想知道。

4

2 回答 2

5

问题是,您声明了一个user在函数上下文中调用的变量:

var user = { };

这将覆盖/重叠user由外部函数上下文声明为形式参数的。在if-statement之后声明该变量无济于事。由声明的变量var函数声明在解析时被提升,所以事实上,该var user语句被放置在你的内部函数之上。

于 2012-10-23T15:44:53.037 回答
1

答案是由于提升,即使您在其他表达式 () 中使用变量 () 之后users声明变量 ( ) ,它也会首先被解析,而原始引用被覆盖。有几个关于在那里吊装的文档,对它们进行顶峰可能是个好主意。var usersuser.password != derivedKeyusers

于 2012-10-23T15:57:23.067 回答