2

这段代码有效,但我的问题是我不明白var that = this. 为什么我需要这样引用它才能将它传递给 setInterval。我在http://www.sitepoint.com/what-is-this-in-javascript/中读到了“this” ,但它并没有真正回答我的问题

我的 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);
};

}

4

2 回答 2

5

this关键字的值与它function在其中使用以及如何function被调用有关。

这包括两者letSpin()以及function传递给setTimeout(). 而且,匿名function者不会仅通过其位置自动继承或共享this价值。letSpin()

因此,您必须使用另一个名称捕获变量中的值。

var that = this;

或者,绑定function它,以便在调用时使用特定值。

setTimeout(function(){
    this.letSpin();
}.bind(this), 20);

而且,使用bind,您还可以传递不带匿名的方法function

setTimeout(this.letSpin.bind(this), 20);
于 2013-09-19T04:30:57.927 回答
0

使用此函数实例化对象:

function newClass(klass) {
    var obj = new klass;

    $.map(obj, function(value, key) {
        if (typeof  value == "function") {
            obj[key] = value.bind(obj);
        }
    });

    return obj;
}

这将自动绑定所有函数,因此当对象内部的方法具有其对象的上下文时,您将以习惯的 OOP 样式获取对象。

所以你实例化你的对象不是通过:

var obj = new spinClass();

但:

var obj = newClass(spinClass);
于 2014-12-06T16:32:42.723 回答