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
inside
letSpin
函数对您来说可能是一本不错的读物,因为
将是该闭包中的其他内容。当闭包执行时,将其赋给变量使其保持在作用域内,但setInterval在方法内。在中,第二个示例“调用函数”。为什么“this”引用的是窗口而不是函数呢?我不认为你需要一个
var=this
inside
letSpin
函数可能是you@JohnathanLonowski嗨,我现在更明白了,但是在第二个例子“调用函数”中怎么会这样呢。在这里,它指的是窗口而不是函数,即使在function@user308553如果调用
函数
时未指定
的值,则默认值可能是全局对象,即浏览器中的
窗口
。注意:在严格模式下,默认值改为
undefined
@JohnathanLonowski hi,我现在理解得更清楚了,但是在第二个示例“调用函数”中是如何实现的。在这里,它指的是窗口而不是函数,即使在function@user308553如果调用
函数
时未指定
的值,则默认值可能是全局对象,即浏览器中的
窗口
。注意:在严格模式下,默认值改为
undefined