亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在對象原型方法中引用setInterval / setTimeout中的“this”

在對象原型方法中引用setInterval / setTimeout中的“this”

慕無忌1623718 2019-09-02 16:52:13
通常我會在setInterval中引用“this”時指定一個替代的“self”引用。是否有可能在原型方法的上下文中完成類似的事情?以下代碼錯誤。function Foo() {}Foo.prototype = {    bar: function () {        this.baz();    },    baz: function () {        this.draw();        requestAnimFrame(this.baz);    }};
查看完整描述

2 回答

?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

與Python之類的語言不同,Javascript方法會在您將其提取并將其傳遞到其他位置后忘記它。你也可以


將方法調用包裝在匿名函數中

這樣,訪問baz屬性并同時調用它,這是this在方法調用中正確設置所必需的。


您需要this將外部函數保存在輔助變量中,因為內部函數將引用另一個this對象。


var that = this;

setInterval(function(){

    return that.baz();

}, 1000);

將方法調用包含在胖箭頭函數中

在實現箭頭函數功能的Javascript實現中,可以使用胖箭頭語法以更簡潔的方式編寫上述解決方案:


setInterval( () => this.baz(), 1000 );

胖箭頭匿名函數保留了this周圍的函數,因此不需要使用該var that = this技巧。要查看是否可以使用此功能,請參閱此類兼容性表。


使用綁定功能

最后一種方法是使用Function.prototype.bind等函數或您喜歡的Javascript庫中的等效函數。


setInterval( this.baz.bind(this), 1000 );


//dojo toolkit example:

setInterval( dojo.hitch(this, 'baz'), 100);


查看完整回答
反對 回復 2019-09-02
?
弒天下

TA貢獻1818條經驗 獲得超8個贊

我做了一個代理類:)


function callback_proxy(obj, obj_method_name)

{

    instance_id = callback_proxy.instance_id++;

    callback_proxy.instances[instance_id] = obj;

    return eval('fn = function() { callback_proxy.instances['+instance_id+'].'+obj_method_name+'(); }');

}

callback_proxy.instance_id = 0;

callback_proxy.instances = new Array();


function Timer(left_time)

{

    this.left_time = left_time; //second

    this.timer_id;


    this.update = function()

    {

        this.left_time -= 1;


        if( this.left_time<=0 )

        {

            alert('fin!');

            clearInterval(this.timer_id);

            return;

        }

    }


    this.timer_id = setInterval(callback_proxy(this, 'update'), 1000);

}


new Timer(10);


查看完整回答
反對 回復 2019-09-02
  • 2 回答
  • 0 關注
  • 368 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號