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我不确定是否理解你的问题:-|