2016-05-01 10 views
0

このコードは正常に動作します:javascript - setintervalはオブジェクトにプロパティを忘れさせますか?

function whatever() { 
    var s = new a('ayy'); 
    s.recall(); 
} 

function a(word) { 
    this.word = word; 
    this.recall = function() { 
     alert(this.word); 
    } 
} 

ブラウザはayyをユーザに警告します。しかし、このようにした理由:

function whatever() { 
    var s = new a('ayy'); 
    setInterval(s.recall,1000); 
} 

function a(word) { 
    this.word = word; 
    this.recall = function() { 
     alert(this.word); 
    } 
} 

しかし、この例では、「未定義」というアラートが「ayy」ではなく毎秒表示されます。どうしてこれなの??

答えて

4

setInterval()が呼び出しているため、関数内で適切な値のthisが失われています。

変更するにはあなたのコード:ちょうど関数リファレンスとsの値を渡し

setInterval(s.recall.bind(s),1000); 

あなたはsetInterval()s.recallを渡す

は、 recallsetInterval()によって呼び出されたときに渡されていません。これは、関数参照の場合にも当てはまります。

あなたがやった場合:

var f = s.recall; 
f(); 

あなたは同じ問題を見ることになります。 .bind()を使用すると、関数がs.recall()として呼び出され、sの値が保持され、したがってメソッドの内部にthisの値が保持されます。


関数内のthisの値は、呼び出される方法によって決まります。メソッドがthisの正しい値を持つには、thisの値を制御するために、obj.method()のように呼び出すか、.bind(),.call()または.apply()のようなものを使用する必要があります。 setInterval()はこれを実行していません。単に通常の関数呼び出しを行うため、thisはグローバルに設定されるか、またはundefinedに設定されます(厳密なモードであるかどうかによって異なります)。

thisの値がJavaScript関数でどのように制御されているかについては、Controlling the Value of this in a functionを参照してください。

関連する問題