Pekka'nın söylediği doğru, ancak işlev işaretlerini veya delegeleri tam olarak anlamayan birine açıklamaya yardımcı olacak bir örnekle biraz ayrıntıya girmek istiyorum.
Ben kullanmaz window.onloadgöstermek için yapmacık biraz çünkü. Bunun yerine demo yapmak için basit bir çarpma işlevi kullanacağım:
function Multiply(operator, operand) {
return operator * operand;
}
Bu eşit şekilde yazılabilir:
Multiply = function(operator, operand) {
return operator * operand;
}
İlk örnekte, çıkarım açık olmasa da, ikinci örnek, adı verilen bir değişkene 2 parametresi olan bir işlevi atadığımızı daha açık bir şekilde göstermektedir Multiplyve bu işlev kavramı, atama olarak JavaScript'te yaygındır. Bu, işlevlerin "birinci sınıf vatandaşlar" olduklarının, yani değerlerin etrafından dolaşıyormuşuz gibi dolaştıkları gerçeğinin küçük bir göstergesidir .
Öyleyse şimdi görev farkına gelelim:
var operator = 3;
var operand = 4;
var ret = Multiply(operator, operand);
Ret değişkenini tanımlama noktasında Multiplyçalıştırılır ve dönüş değeri atanır - ret12'ye eşit olur.
Bunu tekrar farklı bir şekilde deneyelim:
var operator = 3;
var operand = 4;
var ret = Multiply;
Şimdi, tanımlama noktasında ret, retsenin olur Multiplysenin elde edilen sonuç olmanın aksine fonksiyonu Multiplyişlevi. Çağrılar ret(), Multiplyişlevinizin yürütülmesine neden olur ve tam olarak aradığınız gibi çağırabilirsiniz Multiply(operator, operand):
var out = ret(3, 4);
aynıdır
var out = Multiply(3, 4);
retTemsilci olarak kullanacağınızı etkili bir şekilde söylediniz Multiply(). Ararken retgerçekten Multiplyişleve atıfta bulunuyoruz .
Geri dön window.onload. Bunu şu şekilde düşünün:
window.onload = function() {
//Doing what all good window.onload functions should do...
}
initAll = function() {
return 12;
}
Gördüğünüz window.onloadgibi, diğer herhangi bir işlev gibi bir işlev, özel bir yanı yok. Ona bir değer atayabilir, ona bir işlev atayabilir, isterseniz geçersiz kılabilirsiniz - mesele şu ki window.onload, kendi işlevinizle ilgili olduğundan daha özel bir şey yoktur . Sadece biraz farklı olan şey, yüklendiğinde pencereden çağrılmasıdır. [Feragatname: Aslında pencere işlevlerini hiçbir zaman geçersiz kılmadım, bu yüzden bunun olumsuz tepkilere neden olup olmayacağından emin değilim. Biri, ie if (window.onload) window.onload();] çağrılmadan önce bir işlevin atanıp atanmadığını kontrol etmelerini umabilir .
Şimdi initAll()söylediğimiz şudur:
window.onload = initAll();
diyebilir ki:
window.onload = 12;
Dediğimiz Ama initAllparantez olmadan ne biz gerçekten söylüyorsun: Ben benim window.onload fonksiyonu yeni işlevle, her ne değiştirmek istiyor - yani benim ile değiştirmek istediğiniz initAllişlevi böylece herhangi aramalar window.onloadçalışır benim initAllkodu.
Yani:
window.onload = function() {
//Doing what all good window.onload functions should do...
}
şununla değiştirilir:
window.onload = function() {
return 12;
}
Bu nedenle, herhangi bir çağrı , başlangıçta olan şey yerine işlevinizi window.onloadyürütecektir . Orijinal işlevi yeni işlevinizle değiştirdiniz.initAllwindow.onload
Aslında, olabilir eşit yazın:
window.onload = function() {
//Write all your init code right in here instead of having a separate
//initAll function.
}
Daha iyi gösterebilecek bir başka örnek şudur:
var d = new Date();
var currentTime = d.getTime();
Zamanın dtanımlandığı zaman ne olursa olsun atanır currentTime. Harika, ancak bu yalnızca bu kodu içeren işlevin ne zaman çağrıldığını - yani sayfa yükleme zamanında - öğrenmek istiyorsak yararlıdır. Ya currentTimearanan herhangi bir zamanda şimdiki zamanı istersek ?
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
Dediğimiz nasıl Bildirimi b()bizim içinde cve dArayabileceğimiz tam olarak atamaları currentTime()?