属性对象Javascript不是用Jquery Deferred设置的

Property Object Javascript is not set with Jquery Deferred

本文关键字:Jquery Deferred 设置 对象 Javascript 属性      更新时间:2023-09-26

我有以下代码:

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为空?为什么会发生这种情况?

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(在严格模式下)。