2011-12-21 4 views
1

ファーストを終了すると、JavaScriptでのコールバック関数がのみ実行されている理由を理解することは、メソッドの引数について理解するものである:すべてがこのすべての

get(arg1, arg2) { 
    arg1 + arg2 
    //same as arg2 + arg1 
} 

私は結果がする最初に行くどの引数問題ではありません理解したよう同じである。

したがって、この例では:

get(arg1, function(value) { 
    console.log(value) 
}); 

私はかなり第二引数(無名関数)がその実行時にすべて終了した理由を理解していません。私はそれが引数であればなぜ実行するのかも分かりません(引数は関数内の変数であることを理解しています)。

私はまだJavaScriptコールバックを理解できません(私はいくつかのコンセプトを混同していると思います)。

誰でもこのことを私に説明できますか?

答えて

2

コールバックは、単なるコード(関数)で、通常の値のように扱うことができます。数字、文字列、ブール値、関数など、もう1つの型と考えることができます。関数を引数として渡すと、受信者は好きなときにそれを行い、好きなときに実行することができます。

function receiver(callback) { 
    callback(); 
} 

receiver(function() { 
    alert('Foo'); 
}); 

var bar = function() { 
    alert('bar'); 
}; 

receiver(bar); 

function baz() { 
    alert('baz'); 
} 

receiver(baz); 

上記bar例では、関数は普通の値のように扱うことができることを示し、baz例は、その上にだけ変化します。

+0

私はそれらが価値であると理解しています。私が明確にしたいことは、関数内で実行される引数であるかどうかです。なぜ彼らはすべてが終わった後に行うのですか? – alexchenco

+0

コールバックは*単独では実行されません。受信機はある時点でそれらを実行する必要があります。それはあなたの質問に答えますか? – deceze

2

http://en.wikipedia.org/wiki/Continuation-passing_style

私は、引数が関数内だけの変数であることを理解しています。 私が明確にしたいのは、 が関数内で実行される引数なのかどうかです。

ええと、あなたが意味することは難しいです。どういうわけか、これは名前が何とか価値のある細胞だと思うように見えます。

実際にあなたがこれを行うとき:

その後
function f(y) { 
    return y; 
} 

var x = 1; 
f(x); 

F(X)とf内の名前yは同じ値のセル、その中に「1」を有する細胞(とで名前のないを参照してください。 cell - 名前は値のセルではなく、値のセルはそれを参照する複数の名前を持つことができます)。あなたが外から使用する機能を渡す方法を今こと

function f(y, multiplyByA) { 
    return multiplyByA(y + 1); 
} 
f(y, function(b) { return a * b; }); 

注:

function f(y, a) { 
    return a * (y + 1); 
} 
f(y, a) 

あなたもこれを行うことができます:

何継続渡しスタイルで起こることは、これに代えてということです。 その場合、fがmultiplyByAを直ちに呼び出す代わりに、どこかで覚えておいて後で呼び出すことも可能です。

また、代わりにそれを呼び出すのでは、このように、どこかでそれを覚えて、後でそれを呼び出します。他の誰かに(差し出がましい)機能を与えることができます:のsetTimeoutはすぐmultiplyByAを呼び出すことはありませんか

function f(y, multiplyByA) { 
    window.setTimeout(20, multiplyByA); 
} 
f(y, function(b) { return a }); 

は注意どこかにそれを置き、呼び出し元に戻ります。時間が経過した後

、それはあなたの関数を呼び出します。実際の値のセルは、関数や何かの中に限定されているわけではないので、問題はありません。

これはJavaScriptで毎日使用されている - 例えば、あなたのXMLHttpRequestへの答えがあるの後に、あなたが何かをしたいとしましょう。次に、XMLHttpRequestを作成し、その関数にonreadystatechangeを設定することができます。それは結局呼び出されます。答えがあるまでのXMLHttpRequestがアプリケーションをブロックしません

注意。 その代わりに:

answer = XMLHttpRequest(...); 
console.log(answer); 

あなたが実行します。何もすぐに返されていないのではなく、あなたの関数が記憶されますと、何かが起こるとき、それはバックと呼ばれる方法を

XMLHttpRequest(..., function(answer) { 
    console.log(answer); 
}); 

お知らせ。

継続スクリプトのスタイルを使用するように関数を設計する必要があることに注意してください。関数を使用するだけでは問題ありません。

「電話しないで、電話します」

関連する問題