属性对象Javascript未使用Jquery Deferred设置

时间:2014-08-17 04:53:53

标签: javascript jquery jquery-deferred

我有以下代码:

function cBase() {   

}

function Setting() {
    this.myvar='';
}

Setting.prototype = new cBase();
Setting.prototype.setVal=function() { 
    var deferred=$.Deferred();
    setTimeout(function(){
        this.myvar='my value';
        console.log('value '+this.myvar);
        deferred.resolve();
    },2000);

    return deferred.promise();
};


var oset=new Setting();   
oset.setVal().done(function(){
    console.log('all done '+oset.myvar);
});

以前使用值myvar设置了属性"my value",但是当我使用对象oset并调用方法setVal()时,属性myvar是空的?为什么会这样?

1 个答案:

答案 0 :(得分:0)

this的值不会是setTimeout()回调中的对象。您需要使用.bind()来确保this符合您的要求,或者使用另一个变量来保存它。

Setting.prototype.setVal=function() { 
    var deferred=$.Deferred();
    var self = this;
    setTimeout(function(){
        self.myvar='my value';
        console.log('value '+self.myvar);
        deferred.resolve();
    },2000);

    return deferred.promise();
};

请记住,this由函数的调用者决定。对于正常函数调用,它是setTimeout()在调用其回调函数时所执行的操作,this设置为全局对象(在常规模式下)或undefined(在严格模式下)。