Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 回调中对此的困惑_Javascript_Node.js_Mongoose - Fatal编程技术网

Javascript 回调中对此的困惑

Javascript 回调中对此的困惑,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,我真的很困惑这个在回调中的值,我知道它的值总是从调用它的地方获取,但是在下面的代码中,我无法理解发生了什么 userSchema.pre("save", function(next) { let user = this; bcrypt.hash(user.password, 10, function(err, hash) { if (err) { next(err) } else { user.pas

我真的很困惑这个在回调中的值,我知道它的值总是从调用它的地方获取,但是在下面的代码中,我无法理解发生了什么

userSchema.pre("save", function(next) {
    let user = this;
    bcrypt.hash(user.password, 10, function(err, hash) {
        if (err) {
            next(err)
        } else {
            user.password = hash;
            next();
        }
    })
});
我在看mongoose的node js教程,所以老师说: 在这个回调函数的上下文中,单词this指的是对象,它是

let userSchema = new mongoose.Schema({
    password: {
        type: String,
        required: true
    }
});
这里的
user=this
不应该引用节点全局对象而不是该对象吗

所以我真的很困惑这是怎么发生的,例如,如果我试图用简单的JavaScript来模拟代码行为

function UserSchema() {
    this.pre = function(cb) {
        return cb();
    }
}

function Bycrypt() {
    this.hash = function(cb) {
        return cb();
    }
}

userSchema.pre(function() {
    var user = this;
    bycrypt.hash(function() {
        console.log(user)
    })
});
这将把用户记录为窗口对象,因为回调函数是在窗口上下文中调用的


好吧,我知道这是一个奇怪的问题。

这根本不是一个奇怪的问题,
这个
关键字由于其隐含的性质往往是一个混乱的来源:-)无论如何,我不知道
pre
函数是如何实现的,但我们可以很容易地想象这样的情况:

schema={
whoami:“一个模式”
};
schema.pre=函数(cb){
返回cb.call(本);
}
schema.pre(函数(){
console.log(this.whoami);

});
在JavaScript函数中,此
指的是执行上下文,在正常情况下(不是ES6特定的“arrow”函数)通常等于上下文,函数被调用。但是,可以通过使用或函数对象的方法来更改“this”,以便为
this
传递不同的值


例如,您可以阅读MDN上的详细信息。

此绑定到函数的调用站点。还可以使用函数方法(如
call
apply
bind
)将其绑定到指定要绑定的位置

函数foo(){
var a=5;
console.log(this.a);
}
var a=2;

foo();//2
在您的代码演示中使用以下答案:答案更新::-)现在事情开始有了一些意义,但是您能否向我解释一下
userSchema.pre
的上下文是否设置为
userSchema
。那么,我们是否可以直接将
this.password
传递到回调中的
bcrypt.hash
,而不必将其引用存储在用户变量中,然后将其传递给
bcrypt.hash
@OsamaXäwãñz?问题是
this
可能引用回调中的不同对象:-|@OsamaXäwãñz我不确定是否理解你的问题:-|