ペッカの言うことは正しいですが、関数ポインタやデリゲートを完全に理解していない人に説明するのに役立つ例を少し詳しく説明したいと思います。
これはwindow.onloadデモンストレーションが少し工夫されているので、使用しません。代わりに、単純な乗算関数を使用してデモを行います。
function Multiply(operator, operand) {
return operator * operand;
}
これは同様に書くことができます:
Multiply = function(operator, operand) {
return operator * operand;
}
最初の例ではその意味が明らかではないかもしれませんが、2番目の例は、2つのパラメーターを持つ関数をと呼ばれる変数に割り当てていることをより明確に示しています。割り当てMultiplyとしての関数のこの概念は、JavaScript全体で共通です。これは、関数が「ファーストクラスの市民」であるという事実の小さなデモです。つまり、関数は、値を渡すように正確に渡すことができます。
それでは、割り当ての違いを見てみましょう。
var operator = 3;
var operand = 4;
var ret = Multiply(operator, operand);
ret変数を定義する時点で、Multiplyが実行され、戻り値が割り当てられますret-12になります。
別の方法でもう一度試してみましょう。
var operator = 3;
var operand = 4;
var ret = Multiply;
これで、を定義した時点で、関数から取得した結果ではなく、関数retにretなります。to を呼び出すと、関数が実行され、呼び出した場合とまったく同じように呼び出すことができます。MultiplyMultiplyret()MultiplyMultiply(operator, operand)
var out = ret(3, 4);
と同じです
var out = Multiply(3, 4);
あなたはret、のデリゲートとして使用するつもりであると効果的に述べましたMultiply()。を呼び出すときはret、実際にはMultiply関数を指します。
に戻るwindow.onload。これを次のように考えてください:
window.onload = function() {
//Doing what all good window.onload functions should do...
}
initAll = function() {
return 12;
}
ご覧のとおり、window.onload他の関数と同じような関数であり、特別なことは何もありません。値を割り当てたり、関数を割り当てたり、必要に応じてnullにしたりできます。重要なのwindow.onloadは、独自の関数よりも特別なことは何もないということです。わずかに異なるのは、ロード時にウィンドウによって呼び出されることです。[免責事項:ウィンドウ関数を実際に無効にしたことはないので、これが悪影響をもたらすかどうかはわかりません。関数を呼び出す前に関数が割り当てられているかどうかを確認することを期待しif (window.onload) window.onload();ます。つまり、]です。
ここでinitAll()私たちが言っていることは、次のとおりです。
window.onload = initAll();
これは言うかもしれません:
window.onload = 12;
しかしinitAll、括弧なしで言うとき、私たちが本当に言っているのは、window.onload関数を新しい関数で置き換えたいです。つまりinitAll、これを関数で置き換えてwindow.onload、initAllコード。
そう:
window.onload = function() {
//Doing what all good window.onload functions should do...
}
に置き換えられます:
window.onload = function() {
return 12;
}
したがって、を呼び出すと、元々あった関数の代わりに関数window.onloadが実行されます。元の関数を新しい関数に置き換えました。initAllwindow.onload
実際、次のように書くこともできます。
window.onload = function() {
//Write all your init code right in here instead of having a separate
//initAll function.
}
より良い例としては、次のようなものがあります。
var d = new Date();
var currentTime = d.getTime();
その時点dで定義されていたものは何でも、最終的にはに割り当てられcurrentTimeます。すばらしいですが、そのコードを含む関数がいつ呼び出されたか(つまり、ページの読み込み時)を調べたい場合にのみ役立ちます。currentTime呼び出されたときにいつでも現在の時刻が必要な場合はどうなりますか?
var currentTime = function() {
var d = new Date();
return d.getTime();
}
var a = currentTime(); //The current time at the point a is defined...
var b = currentTime; //b is a functional reference to currentTime...
var c = b(); //The current time when variable c is defined
var d = c; //The current time when variable c was defined
呼び出し可能な方法b()で、cとd割り当てを呼び出す方法に注意してくださいcurrentTime()。