addEvent('mybutton','touchstart', function(){ if(window['touchmoved']==false) hover(); }); function hover(){ "> addEvent('mybutton','touchstart', function(){ if(window['touchmoved']==false) hover(); }); function hover(){ "> addEvent('mybutton','touchstart', function(){ if(window['touchmoved']==false) hover(); }); function hover(){ " />

どのように 'this'スコープをjavascriptの関数呼び出しに転送するか

this スコープをイベントリスナーを呼び出す要素に転送するにはどうすればよいですか?

例:

<input type=button value="Foo" id=mybutton>

addEvent('mybutton','touchstart', function(){
    if(window['touchmoved']==false)
    hover(); 
});


function hover(){
    this.value //undefined
}
2
追加された 著者 Felix Kling,

3 答え

JavaScriptの Function.call を使用してください。 Function.apply メソッド:

addEvent('mybutton','touchstart', function(){
    if(window['touchmoved']==false)
        hover.call(this);//`this` of the called hover points to this `this`
});
7
追加された
ありがとう、かなりうまくいく!
追加された 著者 Vitim.us,
this の上にパラメータを渡す場合は、 hover.call(this、 "something")を使用します。 code> hover( "something")(これはthisです)。
追加された 著者 Rob W,
呼び出しと適用はほぼ同じです - それ以外は第2パラメータが必要です - 呼び出しはしません:)これ以外のものを割り当てる必要がない場合はCallを使用し、他の値を割り当てる必要がある場合は適用を使用します。
追加された 著者 Stuart.Sklinar,
私はそれを取り戻す - 私はそれが必要だったどこかを読んだ - しかし、私は訂正した - リンクのおかげで!
追加された 著者 Stuart.Sklinar,
@ Stuart.Sklinar: .apply には2番目の引数は必要ありません。 15.3.4.3 Function.prototype.apply(thisArg、argArray)の手順2を参照してください。 。特定の実装上の問題が分かっていないかぎり?
追加された 著者 RightSaidFred,

hoverメソッドを呼び出すhover()メソッドでfunction.Call()メソッドを使用できます。

Callメソッドの最初のパラメータは、呼び出し側のメソッドでこのメソッドに代入される値です。

例えば:

addEvent('mybutton','touchstart', function(){
if(window['touchmoved']==false)
{

}
    hover.call(this); 
});


function hover(){
    //this = touchstart event
}
0
追加された
途中で@nnnnnn、私は無関係な何かを呼び出すために知っている唯一の方法は、 setTimeout setInterval を使用しています。
追加された 著者 Vitim.us,
呼び出しは実際には非同期ではなく、ちょうどonchangestate(ちょうどデータのダウンロードはassyncです)で発生したイベントです、私は別の関数assynchronousで関数を呼び出す方法が不思議ですので、 setTimeout(func2,1); は、絶対範囲を止めることなく別の関数を呼び出す唯一の方法です。
追加された 著者 Vitim.us,
適切に編集されました!
追加された 著者 Stuart.Sklinar,
.call()は非同期ではありません。 (そのため、一般的なコールバックは本質的に非同期ではありませんが、多くの非同期プロセスではコールバックメカニズムが使用されます)。
追加された 著者 nnnnnn,
@Vitimtk - Ajax呼び出しは、典型的な例ですが、必ずしもそうである必要はありません。スクリプトファイルを非同期に読み込むこともできます。すべてのJSが1つのスレッドで実行されるため、非同期コードは同時に実行されていないため、現在のブロックが完了するとキューに入れられます。
追加された 著者 nnnnnn,
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript