0

イベントがバインドされたときに利用可能だったコールバック関数内の値を確認できるようにしたい。イベントがバインドされたときに関数が定義されている場合、関数内でクロージャーを介して値を確認できます。

var number = 777;
$('span').click(function() { 
    alert(number); //alerts 777  - available through closure
});

しかし、'number' 変数が使用できなかったときに関数が以前に定義されていた場合、このトリックは機能しません。関数が次のようにイベントにバインドされている場合、関数 number_alerter は 'number' 変数を参照できません。

$('span').click(number_alerter);

唯一の解決策は、「number」引数を使用して関数を定義し、「number」変数を関数に渡すことです。

//function defined somewhere earlier
function number_alerter(e, number) {    
    alert(number);
}
...
//current scope
var number = 777;
$('span').on('click', function(e) { 
    return number_alerter(e, number);
});

私の質問は、この変数を「number_alerter」関数に渡す別の方法があるかどうかです。多分それは閉鎖によっても可能ですか?

編集:上記が必要になる可能性がある実際のケースは次のとおりです。私には2つの機能があります:

array_sort(array, compare_function)
compare_values(value1, value2, case_insensitive)

関数 array_sort は、compare_values 関数に 2 つの値のみを渡しますが、関数 array_sort を使用する場合は、3 番目の大文字と小文字を区別しないパラメーターも渡す必要があります。その方法を知っている唯一の方法は、compare_values 関数を別の関数にラップすることです。

var my_array = [];
var case_insensitive = true;
var wrapper = function(value1, value2) {
    compare_values(value1, value2, case_insensitive)
}
array_sort(my_array, wrapper);

他に方法はありますか?

4

2 に答える 2

1

を使用number_alerterしてコールバック関数を返し、クロージャを使用できます。このような

function number_alerter(num) {
    return function(){alert(num);};
}

// different scope
var number = 777;
$('span').on('click', number_alerter(number));

jsFiddleを参照してください

于 2013-08-18T09:36:48.507 に答える
0

あなたの問題は他の場所にあるはずです。あなたがそれを説明する限り、次の

var number=777;
var alerter=function(){
    alert(number);
};
$("span").click(alerter);

うまく動作します。参照。そして、はい 、変数の定義された状態 (たとえば、スパンごとにクリックカウンターを定義する) にアクセスする必要がある場合は、クロージャーを使用するのが最適です。

編集:ああ、わかりました

$('span').click(
    (function() {
        return number_alerter})());

それはそれを行う方法ではありません。この時点で関数名を渡す必要があります。

于 2013-08-18T09:23:44.920 に答える