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);
});
お知らせ。
継続スクリプトのスタイルを使用するように関数を設計する必要があることに注意してください。関数を使用するだけでは問題ありません。
「電話しないで、電話します」
私はそれらが価値であると理解しています。私が明確にしたいことは、関数内で実行される引数であるかどうかです。なぜ彼らはすべてが終わった後に行うのですか? – alexchenco
コールバックは*単独では実行されません。受信機はある時点でそれらを実行する必要があります。それはあなたの質問に答えますか? – deceze