3

簡単な質問です。私の現在の理解では、次の2つのコードのチャンクは、1つが関数で囲まれていることを除いて同一です。方法1では機能するのに方法2では機能しないのはなぜですか?違いはなんですか?

方法1:

// Reset button
$('.reset').button({
    icons: {primary: 'ui-icon-closethick'}
}).click(function(){groupList.change()});

方法2:

// Reset button
$('.reset').button({
    icons: {primary: 'ui-icon-closethick'}
}).click(groupList.change);

編集: JSFiddle:http ://jsfiddle.net/B8YEa/2/- 「Two」をクリックするとエラーがスローされ、 Uncaught TypeError: Object #<HTMLButtonElement> has no method 'on'「One」をクリックすると問題がないことに注意してください。また、実際の選択の変更も同様です。

4

2 に答える 2

4

違いは、最初のコードがオブジェクトのメソッドとして関数を呼び出すのに対し、2番目のコードは独立した関数として関数を呼び出すことです。

前者の場合、は関数内のオブジェクトthisを参照し、後者の場合はグローバルオブジェクトを参照します。groupListthiswindow

たとえば、オブジェクトメンバーとして指定する関数を呼び出すとobj.method();、メソッドとして呼び出されます。関数への参照を取得してそれを呼び出すと、たとえばvar m = obj.method; m();、メソッドはオブジェクトに接続されなくなります。


また、Thiloが指摘したように、最初のコードはイベントが発生するたびにメソッドを検索し、2番目のコードはイベントがバインドされるたびにメソッドを検索します。

于 2013-01-22T09:45:47.177 に答える
1

groupList.changeまだ存在していないが、後で(ただし、ユーザーがクリックする前に)定義されている場合は、違いがあります。後で再定義された場合も同じです。

クリックが発生すると、最初のコードが解決groupList.changeされます。

2番目のコードはgroupList.changeすぐに解決されます。

于 2013-01-22T09:45:44.840 に答える