0

変数を新しい関数に再割り当てする方法を理解するのに苦労しています。

変数に割り当てられた 2 つの無名関数があり、一度呼び出された後、「first」を「after」に割り当てる必要があります。

Firefox で .toSource を使用すると、first が after に確実に再割り当てされているように見えますが、クリック ハンドラの「first」は、実行時に作成された最初のものを参照または呼び出しています。

どうしてこれなの?

JS

var after = function() {
    alert("AFTER");
}

var first = function() {
    alert("FIRST");
    //alert(first.toSource());
    first = after;
}

$(".order").click( first );

HTML

<button type="button" class="order">Order</button>

http://jsfiddle.net/E2R2R/2/

4

2 に答える 2

5

この呼び出しを行う場合:

$(".order").click( first );

first この呼び出しの時点での値を使用しています。その時の値がclick()関数に渡されます。

後で変数の値を変更しても、firstこれには影響しません。

別の見方をすると、jQuery のclick()メソッド内のコードについて考えてみましょう。first呼び出しで変数を使用したことはわかりません。firstそれが持っている唯一の情報は、呼び出し時に参照する関数です。

あなたが望むことを行う方法については、@ tymeJVの回答を参照してください。違いに注意してください: 渡す.click()関数 (無名関数) を変更する必要はありません。その関数が を呼び出すとfirst()、常にその名前の現在の値が使用されます。

于 2013-11-14T19:23:21.480 に答える
5

@MichaelGeary の回答に続いて、そのように参照して関数を機能させたい場合は、関数呼び出しを匿名関数内に配置します。

$(".order").click( function() {
    first();    
});

デモ: http://jsfiddle.net/E2R2R/4/

于 2013-11-14T19:25:29.523 に答える