0

setinterval関数の実装後に「this」にアクセスしようとしましたが、関数からこれにアクセスできませんでした。以下のように示されています:

apple:'apple',
orange:'orange',
pie:'pie',
initialize:function(){
    var self = this;
    setInterval(this.print(),100);
},
print:function(){
    console.log('print '+ this.apple + ' - ' + this.orange + ' - ' + this.pie);
}    

出力:未定義

これを関数のパラメーターとして渡すと、間隔は1回だけ呼び出されて停止します。

apple:'apple',
orange:'orange',
pie:'pie',
initialize:function(){
    var self = this;
    setInterval(this.print(this),100);
},
print:function(self){
    console.log('print '+ self.apple + ' - ' + self.orange + ' - ' + self.pie);
}    

出力:print apple --orange --pie(その後停止)

setintervalを呼び出した後、どうすれば'this'変数にアクセスできますか?

これがjsfiddleの例です。

4

4 に答える 4

3

匿名関数を使用して、self変数を使用して関数を呼び出します。これにより、関数がselfのスコープで呼び出されるようになり、これを使用して変数に直接アクセスできるようになります。

initialize:function(){
    var self = this;
    setInterval(function() { self.print() },100);
},
print:function(){
    console.log('print '+ this.apple + ' - ' + this.orange + ' - ' + this.pie);
    //console.log(apple);
    //console.log(apple);
}

http://jsfiddle.net/RHqk6/2/

于 2012-07-18T07:06:38.527 に答える
2
setInterval(_.bind(this.print, this), 100);

http://jsfiddle.net/bwB9W/21/

于 2012-07-18T06:59:22.030 に答える
0

匿名関数を使用する必要があります。

apple:'apple',
orange:'orange',
pie:'pie',
initialize:function(){
    var self = this;
    setInterval( function() { self.print() },100);
},
print:function(){
    console.log('print '+ this.apple + ' - ' + this.orange + ' - ' + this.pie);
}   
于 2012-07-18T06:59:04.183 に答える
0

私は今日この問題に遭遇しましたが、mozilla.orgでこの問題と別の解決策を説明する良い説明を見つけました:

https://developer.mozilla.org/en-US/docs/DOM/window.setInterval#The_.22this.22_problemから

説明

setInterval()によって実行されるコードは、呼び出された関数とは別の実行コンテキストで実行されます。結果として、呼び出された関数のthisキーワードはウィンドウ(またはグローバル)オブジェクトに設定され、setTimeoutを呼び出した関数のthis値と同じにはなりません。次の例を参照してください(実際には、setInterval()の代わりにsetTimeout()を使用します。実際、問題は両方のタイマーで同じです)。

そして彼らは私のために働いた解決策をそこに持っていました

考えられる解決策

「この」問題を解決するための可能な方法は、2つのネイティブsetTimeout()またはsetInterval()グローバル関数を、Function.prototype.callメソッドを介した呼び出しを可能にする2つの非ネイティブ関数に置き換えることです。次の例は、可能な置換を示しています。

// Enable the passage of the 'this' object through the JavaScript timers

var __nativeST__ = window.setTimeout, __nativeSI__ = window.setInterval;

window.setTimeout = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) {
  var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2);
  return __nativeST__(vCallback instanceof Function ? function () {
    vCallback.apply(oThis, aArgs);
  } : vCallback, nDelay);
};

window.setInterval = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) {
  var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2);
  return __nativeSI__(vCallback instanceof Function ? function () {
    vCallback.apply(oThis, aArgs);
  } : vCallback, nDelay);
};
于 2012-11-17T01:25:17.910 に答える