为什么这个和_this引用了一个对象的不同实例?

时间:2016-05-29 14:37:25

标签: javascript

我有一个可以简化的课程:

Captcha = function(el) {
    this.el = $(el);
    _this = this;

    captchas.push(this);
};


Captcha.prototype.render = function(grecaptcha){
    console.log(this.el.dom[0]);
    console.log(_this.el.dom[0])
};

该类被两次实例化,其中两个不同的DOM元素作为el传入。

运行全局回调函数时运行渲染。

captchas = [];

//We need  this for captchas.
window.CaptchaCallback = function(){
  app.captchas.forEach(function(capt){
    capt.grecaptcha = grecaptcha;
    capt.render();
  });
};

出于某种原因,this.el.dom[0]引用了两个不同的元素,但_this.el.dom[0]总是引用该类的最后一个实例,为什么?

2 个答案:

答案 0 :(得分:2)

初始化var时,您已离开_this

var Captcha = function(el) {
    this.el = $(el);
    var _this = this; // don't forget var!

    captchas.push(this);
};

因此,您的代码正在创建一个全局变量,而不是本地变量。

当然,它是构造函数的本地函数,因此无论如何它都不会在外面可见。您可以使_this成为构造对象的属性:

    this._this = this;

但这没有多大意义,因为无论如何你都需要this才能找到_this

答案 1 :(得分:1)

因为您没有使用var关键字声明_this,所以隐式声明了一个全局变量。您的构造函数代码等效于:

var _this;
Captcha = function(el) {
    this.el = $(el);
    _this = this;

    captchas.push(this);
};

因为它是全局的,_this总是保存最后创建的实例的值。