1

関数を取得しました -パラメータfunction getdata(after){}として関数を受け取るように定義しましょう。afterとても自然です。この関数は、スコープ内にいくつかの変数が定義されている他の関数から実行されています。

$('.button').click(function(){
   var rel = $(this).attr('rel');
   var mooo = $(this).parent().offset().left;
   getdata(function(){alert(rel);console.log(moo)});
});

これらの変数を正しい方法で渡すにはどうすればよいでしょうか? ボタンをクリックしたときと同じになるでしょうか? ユーザーがボタンをスパムクリックできるため、グローバル変数にすることはできません。after名前が示すように、呼び出されているため、関数が10分後にランダムな順序で呼び出される場合でも、クリック中の変数を正確に保持する必要があります。 ajaxリクエストの後。

これは単なる例です - このafter関数も可変であり、まったく異なる場所から呼び出されるという考えです。


わかりまし-1た。私が何を求めているのかわからないので、問題を説明しようとします。変数が変数として渡されるときと、渡された関数によって使用される前に変更される可能性のある変数のポインターとして渡されるときがよくわかりません。

ある関数で変数を定義して別の関数に渡す場合、それはポインターですか、それともスタンドアロン変数ですか? オリジン関数を再度呼び出し、それらの変数が変更されると、以前に「スケジュール」された関数に影響しますか? または、変数の前にある単語 var は、まったく新しい変数として定義し、var を含む関数が呼び出されるたびに、この変数をまったく新しいものとしてメモリに割り当て、何が起こるかに依存しませんか?

私は通常、PHP、C、および Delphi のプログラマーですが、特にすべてが非同期でコールバックされている場合、これらの変数スコープがどのように機能するかを理解するのは少し難しいです。

4

3 に答える 3

2

簡単に説明すると、JavaScript では、単純な型 (文字列、数値、ブール値) は値によって渡され、オブジェクトは参照によって渡されます。実際の詳細な回答については、この質問を参照してください

処理する引数の数 (またはその型) がわからない場合は、引数配列を使用できます。

var getdata = function(){
    //your function logic

    //arguments is an array with all the args
    //the last one is the "after" function
    var after = arguments[arguments.length-1];
    return after(arguments);
};

$('.button').click(function(){
   var rel = $(this).attr('rel');
   var mooo = $(this).parent().offset().left;
   getdata(rel, moo, /*add all the arguments you want here...*/, function(args){
       alert(args[0]);
       console.log(args[1])
   });
});
于 2013-10-25T18:15:17.053 に答える
1

あなたが何を求めているのかわかりませんが、これは rvignacio の答えのバリエーションであり、 and に任意の数のパラメーターを許可しgetdataますafter:

var getdata = function(after){
    //your function logic
    return after.apply(null, [].slice.call(arguments, 1));
};

$('.button').click(function(){
   var rel = $(this).attr('rel');
   var mooo = $(this).parent().offset().left;
   getdata(function(rel_param, moo_param){
       console.log(rel_param);
       console.log(moo_param)
   }, rel, moo);
});
于 2013-10-25T18:28:21.867 に答える