我有一个可以简化的课程:
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]
总是引用该类的最后一个实例,为什么?
答案 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
总是保存最后创建的实例的值。