0

コールバック関数とクロージャを使用しているときに、なぜ異なる結果が得られるのかを理解しようとしています。

最初のシナリオ:

var cb = function(){
   console.log("anim done");
} 

var anim = Raphael.animation({
    transform: 't0, 100'
}, 2000, cb);

circle.animate(anim);

これを実行すると、問題の円がアニメーション化され、2秒後に「animdone」メッセージがコンソールに表示されます。

2番目のシナリオ:

var cb = function(msg){
   console.log("anim done");
} 

var anim = Raphael.animation({
    transform: 't0, 100'
}, 2000, cb("test"));

circle.animate(anim);

これにより、コールバック(cb)がすぐに実行されます。これにより、「animdone」メッセージがすぐに表示されます。

誰かがここで実際に何が起こっているのかを明確にすることができますか?

4

2 に答える 2

1

関数名を単独で入力すると、関数として評価されます (関数名は基本的に、値が関数である単なる変数です。

関数名の後に括弧を付けると、その時点で指定された引数で関数を呼び出すことを意味します。値は、関数が返すものです。

関数を呼び出す関数を渡したい場合は、次のfunctionキーワードを使用してクロージャーでラップする必要があります。

var anim = Raphael.animation({
    transform: 't0, 100'
}, 2000, function() {cb("test")});
于 2013-02-09T01:28:01.677 に答える
0

コールバックを提供する場合、それは関数でなければなりません。cb("test")は関数ではありません — 関数の戻り値です。関数から何かを返すとcb("test")、期待どおりに機能します。

そのまま、これを行う必要があります:

var anim = Raphael.animation({
    transform: 't0, 100'
}, 2000, function() {
    cb("test");
});

このようにして、評価済みの式ではなく関数をアニメーションに渡します。

于 2013-02-09T01:27:54.377 に答える