在javascript中使用此关键字

时间:2016-02-25 14:21:23

标签: javascript node.js

Mongoose Schema

var UserSchema = new Schema({
  name: {
        type: String,
        unique: true,
        required: true
    },
  password: {
        type: String,
        required: true
    }
});

上面的代码只是为了显示UserSchema只是一个实例。我在下面使用this时感到困惑。那指的是什么?

UserSchema.pre('save', function (next) {
    var user = this;
    if (this.isModified('password') || this.isNew) {
        bcrypt.genSalt(10, function (err, salt) {
            if (err) {
                return next(err);
            }
            bcrypt.hash(user.password, salt, function (err, hash) {
                if (err) {
                    return next(err);
                }
                user.password = hash;
                next();
            });
        });
    } else {
        return next();
    }
});

3 个答案:

答案 0 :(得分:0)

具体做法是:

var user = this;

指:

UserSchema

控制台记录:

var user = this;
console.log(user);

看看周围!

  

为什么我们甚至需要创建一个实例? - @Nichole A. Miler

它为您提供了创建多个实例的选项。

var UserSchema = new Schema({...});
var AnotherUserSchema = new Schema({...});

答案 1 :(得分:0)

预保存中间件中的

this关键字是指您要保存的用户文档,在这种情况下,如果已经设置了这些用户文档,则使用名称和密码。 另外,每个mongoose / mongo的好处,例如isNew,isModified,以及模式中的虚拟字段和方法等等。

答案 2 :(得分:0)

我认为这是ECMAScript中最混乱的机制之一。当你说“这个”时,我认为它会造成混乱,因为我们也试图考虑它字面意思并且最常见的一个错误观念是,不知何故,它指的是函数的范围 - 让我在这里说清楚:this根本没有提到函数的词法范围......

this,在ECMAScript中,它是基于函数调用条件的“基于上下文”。 this绑定与声明函数的位置无关,而是与调用函数的方式有关。所以一个好的开始方式是this不是。

在您的情况下,您希望“保留上下文”,因为稍后将引用它,并且一旦调用其他函数,就会创建激活记录,也称为执行上下文...最终,如果你需要参考前一个,你将不会拥有它。

使用console.log()进行游戏,看看每次通话中的内容,都可以为您提供线索。

注意: ECMAScript 6对此有一些“改进”:)