2017-11-17 16 views
-1

私はjQueryを学び、コールバックの仕組みを理解しようとしています。私はそれが何をしているのか知っている(最初のもので終わった後にいくつかの関数を呼び出す)が、それは私をちょっと捨てる構文です。jQueryコールバック構文

showMenuElement(0); // call to initiate the menu 

function showMenuElement(x) { 
    x += 1; // cycling through elements 
    if (x < 4) { 
     var el = "#menu-" + x; 
     $(el).fadeIn(1000, showMenuElement(x)); // show one element, then show next in line 
    } 
} 

...そしてそれは一度にすべてのメニュー項目を示して、私は、それがしたいようにそれは動作しません:私はこのコードを持っています!

showMenuElement(0); // call to initiate the menu 

function showMenuElement(x) { 
    x += 1; // cycling through elements 
    if (x < 4) { 
     var el = "#menu-" + x; 
     $(el).fadeIn(1000, function() { showMenuElement(x) }); // show one element, then show next in line 
    } 
} 

それは(fiddle 2あたりのように)別の後に一つの項目を示し、魔法のように動作します:

私はこのように、function() {...}部分を追加した場合、しかし: (fiddle 1ここで作業フィドルです)。

なぜこのように動作するのか説明を探していますか? 私は、コールバックなので実装する関数の名前を探しますが、function() {...}の記述は明白に何を変更するのですか?

答えて

1

最初のコードスニペットでは、fadeInメソッドの中で関数showMenuElementを呼び出す代わりに、このコールバック参照が必要でコールバックコールが必要です。これは、2番目のスニペットが機能するため、それを呼び出す。

あなたが期待していると(私の悪い英語を容赦)

+0

まあ、私はそれを呼び出すアイデアだったが、アニメーションが終了した後に呼び出し自体が実行されることになる。明らかに私はそれが間違っていた:) – senemedar

+0

コールバック関数のパラメータを扱う場合は、関数(){showMenuElement(x)}を持つあなたは良い解決策です。 :) –

+0

@ChristopheCoquelet:あなたは良い方法ですが、最初の方法がうまくいかない理由を技術的に説明することで、少しだけあなたの答えを改善することができます。 – Techniv

0

最初の方法では動作しません。あなたは関数を実行しており、コールバックとして 'showMenuElement'の戻り値を渡しているからです。

しかし、2番目のケースでは、コールバックとして無名関数を渡します。ここでは動作します。

$(エル).fadeIn(1000年、showMenuElement)のような行を書きすなわち方法から

削除();

その後、コールバックが機能します。

しかし、xパラメータを別の方法で処理する必要があります。