javascript在对象方法中传递此消息
这段代码有效,但我的问题是我不理解javascript在对象方法中传递此消息,javascript,object,this,Javascript,Object,This,这段代码有效,但我的问题是我不理解var that=this的目的。为什么我需要这样引用它才能将其传递给setInterval。我在书中读到了这个,但它并没有真正回答我的问题 我的JavaScript代码 function spinClass(imageSource, height, width, forward, el){ this.src = imageSource; this.spinFoward = forward; this.element = document.getElement
var that=this
的目的。为什么我需要这样引用它才能将其传递给setInterval。我在书中读到了这个,但它并没有真正回答我的问题
我的JavaScript代码
function spinClass(imageSource, height, width, forward, el){
this.src = imageSource;
this.spinFoward = forward;
this.element = document.getElementById(el);
this.height = height;
this.width = width;
this.d = 0;
var img = document.createElement("img");
img.setAttribute('src', this.src);
img.setAttribute('height', this.height);
img.setAttribute('width', this.width);
this.element.appendChild(img);
this.letSpin = function letSpin(){
//alert(this.d);
var that = this;
img.style.transform = "rotate(" + this.d + "deg)";
img.style.WebkitTransform= "rotate(" + this.d + "deg)";
img.style.MozTransform= "rotate(" + this.d + "deg)";
img.style.msTransform= "rotate(" + this.d + "deg)";
img.style.OTransform= "rotate(" + this.d + "deg)";
//alert(this.spinFoward);
if (this.spinFoward == true){
this.d++;
}else{
this.d--;
}
setInterval(function(){that.letSpin();}, 20);
};
}的值与函数中使用的函数以及调用该函数的方式有关
这包括letSpin()
和传递给setTimeout()
的简短匿名函数。而且,匿名函数
不会仅通过其位置自动从letSpin()
继承或共享该值
因此,您必须使用另一个名称捕获变量中的值
var that = this;
或者,当调用它时,它将使用一个特定的值
setTimeout(function(){
this.letSpin();
}.bind(this), 20);
而且,使用bind
,您还可以在不使用匿名函数的情况下传递该方法
setTimeout(this.letSpin.bind(this), 20);
的值与它在中使用的函数
以及调用该函数
的方式有关
这包括letSpin()
和传递给setTimeout()
的简短匿名函数。而且,匿名函数
不会仅通过其位置自动从letSpin()
继承或共享该值
因此,您必须使用另一个名称捕获变量中的值
var that = this;
或者,当调用它时,它将使用一个特定的值
setTimeout(function(){
this.letSpin();
}.bind(this), 20);
而且,使用bind
,您还可以在不使用匿名函数的情况下传递该方法
setTimeout(this.letSpin.bind(this), 20);
使用此函数实例化对象:
函数新类(klass){
var obj=新的klass;
$.map(对象,函数(值,键){
如果(值的类型==“函数”){
obj[key]=value.bind(obj);
}
});
返回obj;
}
这将自动绑定所有函数,因此您将以习惯的OOP样式获取对象,
当对象中的方法具有其对象的上下文时
因此,您不通过以下方式实例化对象:
var obj = new spinClass();
但是:
使用此函数实例化对象:
函数新类(klass){
var obj=新的klass;
$.map(对象,函数(值,键){
如果(值的类型==“函数”){
obj[key]=value.bind(obj);
}
});
返回obj;
}
这将自动绑定所有函数,因此您将以习惯的OOP样式获取对象,
当对象中的方法具有其对象的上下文时
因此,您不通过以下方式实例化对象:
var obj = new spinClass();
但是:
因为
这个
将是该闭包中的其他东西。当闭包执行时,将其赋给变量使其保持在作用域内,但setInterval在方法内。在中,第二个示例“调用函数”。为什么“this”引用的是窗口而不是函数呢?我不认为你需要一个var=this
insideletSpin
函数对您来说可能是一本不错的读物,因为此
将是该闭包中的其他内容。当闭包执行时,将其赋给变量使其保持在作用域内,但setInterval在方法内。在中,第二个示例“调用函数”。为什么“this”引用的是窗口而不是函数呢?我不认为你需要一个var=this
insideletSpin
函数可能是you@JohnathanLonowski嗨,我现在更明白了,但是在第二个例子“调用函数”中怎么会这样呢。在这里,它指的是窗口而不是函数,即使在function@user308553如果调用函数
时未指定此
的值,则默认值可能是全局对象,即浏览器中的窗口
。注意:在严格模式下,默认值改为undefined
@JohnathanLonowski hi,我现在理解得更清楚了,但是在第二个示例“调用函数”中是如何实现的。在这里,它指的是窗口而不是函数,即使在function@user308553如果调用函数
时未指定此
的值,则默认值可能是全局对象,即浏览器中的窗口
。注意:在严格模式下,默认值改为undefined
。