首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript - var self = this;self未定义

JavaScript - var self = this;self未定义
EN

Stack Overflow用户
提问于 2017-02-10 04:19:06
回答 1查看 2.3K关注 0票数 0

这是我遇到的情况。我有一个具有许多属性和方法的构造函数。以下是这些属性:

代码语言:javascript
复制
var Brain = function(){
  this.util = require('util');
  this.fs = require('fs');
  this.assert = require('assert');
  this.Sequelize = require('sequelize');
  this.JsonField = require('sequelize-json');
  this.bcrypt = require('bcrypt-nodejs');
  this.bodyParser = require('body-parser');
  this.fileUpload = require('express-fileupload');

  // Custom Modules
  this.ModelsModule = require('./models');
  this.TombModule = require('./tomb');

}

其中一些方法被定义为调用给定的回调并将数据传递给它,例如:

代码语言:javascript
复制
Brain.prototype.db_read = function(request, response, data, callback) {
  var self = this;

  self.ModelsModule[data.Model].findOne(data.where)
  .then(function(obj) {
    // console.log(obj);
    callback(request, response, obj);
  })
  .catch(function(error){
    console.log(error);

  });

}

事情是这样的-回调函数总是同一个构造函数的另一种方法。下面是另一个回调方法:

代码语言:javascript
复制
Brain.prototype.login = function(request, response, user) {
  var self = this;

  // console.log('form-data --- ', request.body);

  if(user == null || user == undefined) {
    console.log('Account Load: Failed');
    return response.render( self.TombModule.pages['login'], {error: 'Invalid Credentials'} );
  }
  else {
    // console.log(user.dataValues);
    if( self.bcrypt.compareSync(request.body.pswrd, user.dataValues.pswrd) == false ) {
      console.log('Account Load: Failed');
      return response.render( self.TombModule.pages['login'], {error: 'Invalid Credentials'} );
    }
    console.log('Account Load: Successful');
    request.session.you = {
      id: user.dataValues.id,
      f_name: user.dataValues.f_name,
      m_initial: user.dataValues.m_initial,
      l_name: user.dataValues.l_name,
      icon: user.dataValues.icon,
      background: user.dataValues.background,
      email: user.dataValues.email,
      phone: user.dataValues.phone,
      fax: user.dataValues.fax,
      uv: user.dataValues.uniqueValue
    };
    return response.redirect('/home');
  }

}

在我的app.js中,创建了一个新的脑实例。

代码语言:javascript
复制
const RoutinesModule = require('./routines');
const brain = new RoutinesModule.Brain();

整个事件链从特快专递路线开始:

代码语言:javascript
复制
app.post('/login', function(request, response){

  var data = {
    Model: 'Users',
    where: {where: {email: request.body.email}}
  }

  brain.db_read(request, response, data, brain.login);

});

注意,Brain.db_read的回调(最后一个参数)是Brain.login,这是同一个构造函数的另一个方法。问题就在这里发生。

/login的POST请求到达app.js时,它将查询数据库并将结果交给任何给定的函数来处理,在本例中是Brain.login

在Brain.db_read()内部,var self = this;工作。它指向自己,大脑的实例。但是,当调用回调(即Brain.login )时,Brain.login中的语句var self = this;不起作用。它会导致未定义,从而导致错误。

为什么会发生这种事?为什么var self = this;在Brain.login内部导致未定义?

最终,我要做的是创建一组主要函数来处理数据库操作(CRUD),而不是在每个单独的函数中执行数据库操作,这是/可能是一个不确定的数量。

我可以很容易地在该函数定义中要求该模块,但我非常希望访问它的属性,以实现动态、可伸缩和高效的方法。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-10 04:21:22

您将方法brain.login作为一个没有所有者的函数传递。您只是传递函数引用。你需要做brain.login.bind(brain)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42151449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档