SORU
14 Temmuz 2010, ÇARŞAMBA


JavaScript, eğer parantez içinde bir işlev diyebilir miyim fark eder mi?

Herhangi bir parantez olmadan boş parantez içinde, ya da bir işlevi çağrılırken bir farklı olduğunu fark ettim. Arasındaki fark ne olurdu merak ettim fonksiyonu herhangi bir parametre geçirmeden değilim:

window.onload = initAll();

ve

window.onload = initAll;

Bunun arkasındaki prensip açıklayınız. Teşekkürler şimdiden.

CEVAP
14 Temmuz 2010, ÇARŞAMBA


Pekka ne derse doğrudur, ama tam olarak işlev işaretçileri veya temsilciler anlamayan birisi için açıklamama yardımcı olacak bir örnek ile biraz daha ayrıntılı istiyorum.

Pencere kullanmayacağım.bu biraz yapmacık göstermek için çünkü yüklendiğinde. Yerine demo için basit bir çarpma işlevi kullanırım:

function Multiply(operator, operand) {
    return operator * operand;
}

Bu eşit olarak yazılabilir:

Multiply = function(operator, operand) {
    return operator * operand;
}

Süredir ilk örnek, ima olmayabilir belli, ikinci örnek gösterir daha net olduğumuzu atama işlevi olan 2 parametre bir değişken adı Çarpın ve bu kavramın işlevleri olarak atamaları ortak boyunca javascript. Bu fonksiyonlar aslında küçük bir gösteri< . em ^"birinci sınıf vatandaş"bu, tam olarak, eğer olsaydık olarak geçirilen etrafında değerler etrafında geçen.

Şimdi atama farkı için:

var operator = 3;
var operand = 4;
var ret = Multiply(operator, operand);

Ret değişken tanımlama noktasında, Çarpma yürütülür ve dönüş değeri atanır - ret 12 eşit olur.

Dene o daha farklı bir şekilde

var operator = 3;
var operand = 4;
var ret = Multiply;

Şimdi, tanımlama ret noktasında, ret sizin sonuç elde işlevi Çarpma olarak işlev Çarpma olur. Ret çağrıları() işlevi, Çarpma yapılmasına sebep olacaktır ve eğer Çarpma(operatör, işlenen) haber verseydiniz olarak tam da diyebilirsiniz:

var out = ret(3, 4);

aynı gibi

var out = Multiply(3, 4);

Etkili bir şekilde Çoğalmak için bir temsilci olarak ret kullanacağız " dedi(). Ret çağırırken, gerçekten işlevi Çarpma tanıtıyoruz.

Pencere geri.yüklendiğinde. Bu gibi düşünün

window.onload = function() {
    //Doing what all good window.onload functions should do...
}

initAll = function() {
    return 12;
}

Yani gördüğünüz gibi, pencere.yüklendiğinde başka bir işlevi gibi bir işlev, özel hiçbir şey yok. Eğer bu noktada artık hiçbir şey özel olduğu pencere hakkında isterseniz bir değer atamak için bir işlev atamak, null.kendi işlevi vardır ve daha yüklendiğinde. Sadece biraz farklı bir şey yüklendiğinde camın adı alır. [Yasal Uyarı: eğer bu olumsuz yansımaları neden olur emin değilim bu yüzden aslında hiç pencere fonksiyonları yazılımıdır dışarı ettim. Tek bir fonksiyon yani çağırmadan önce atanmış olup olmadığını görmek için (pencere.eğer kontrol ediyorlar ki yüklendiğinde) pencere.() yüklendiğinde;].

Şimdi initAll() çağrılıyor mu diyoruz

window.onload = initAll();

söylesen iyi olur:

window.onload = 12;

Ama zaman dediğimiz parantez olmadan initAll, gerçekten söylediğiniz şey şudur: ne olursa olsun benim pencere değiştirmek istiyorum.yüklendiğinde fonksiyonu herhangi bir pencere için çağırır, yeni bir işlev ile benim initAll ile değiştirmek istiyorum, yani işlevidir.yüklendiğinde initAll benim kod çalışır:

Yani:

window.onload = function() {
    //Doing what all good window.onload functions should do...
}

ile değiştirilir:

window.onload = function() {
    return 12;
}

Pencere için herhangi bir çağrı.yüklendiğinde ne olursa olsun pencere yerine initAll fonksiyonunu çalıştırır.yüklendiğinde oldu aslında. Yeni fonksiyonu ile özgün işlevini değiştirdiniz.

Aslında seniolabiliraynı derecede yazma:

window.onload = function() {
    //Write all your init code right in here instead of having a separate 
    //initAll function.
}

Daha iyi gösteren başka bir örnek bu

var d = new Date();
var currentTime = d.getTime();

Zaman zaman her neysedtanımlanan biter currentTime atanır. Harika, ama eğer işlevi bu kodu içeren - yani sayfa yük zaman denilen şey öğrenmek istiyoruz bizim için daha faydalı. Eğer currentTime denilen şimdiki zaman istersek ne olacak?

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 dediğimiz nasıl fark() c ve d tam olarak currentTime çağırabiliriz olarak atamaları()?

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ChasesAndCrashes

    ChasesAndCra

    31 Temmuz 2009
  • EmperorTigerstar

    EmperorTiger

    14 EYLÜL 2009
  • Samantha Crain

    Samantha Cra

    30 EKİM 2008