SORU
19 EYLÜL 2008, Cuma


Neden oldu bu tartışmalar.aranan.arayanın özelliği JavaScript ile yazıldı?

Neden arguments.callee.caller özelliği JavaScript ile yazıldı?

Eklendi ve daha sonra JavaScript ile yazıldı, ama tamamen ECMA tarafından ihmal edildi. Bazı tarayıcı (Mozilla, IE her zaman destek veren ve desteğini kaldırmak için haritada herhangi bir plan yok. Diğerleri (, Opera, Safari) desteği kabul ettiler, fakat eski tarayıcılar desteği güvenilir değil.

Bu belirsizlik içinde işlevselliği değerli koymak için iyi bir neden var mı?

(Veya alternatif olarak kapmak için daha iyi bir yolu var, bir arama işlevi mi?) işlemek

CEVAP
25 EKİM 2008, CUMARTESİ


JavaScript sürümleri işlev ifadeleri adında izin vermedi, ve bu yüzden özyinelemeli bir işlev ifadesi yapamadık:

 // This snippet will work:
 function factorial(n) {
     return (!(n>1))? 1 : factorial(n-1)*n;
 }
 [1,2,3,4,5].map(factorial);


 // But this snippet will not:
 [1,2,3,4,5].map(function(n) {
     return (!(n>1))? 1 : /* what goes here? */ (n-1)*n;
 });

Bu etrafında arguments.callee yapmak istiyoruz ... eklendi:

 [1,2,3,4,5].map(function(n) {
     return (!(n>1))? 1 : arguments.callee(n-1)*n;
 });

Ancak bu gerçekten çok kötü bir çözüm olarak (birlikte diğer değişkenler, aranan, arayan ve sorunları) satır içi uygulaması ve kuyruk özyineleme imkansız genel durum (elde seçin davaları izleme vb. ama en iyisi bile kod alt optimal nedeniyle denetleyen olmaz aksi olması gerekli). Diğer büyük sorunu özyinelemeli çağrı, örneğin: ** 8 farklı değer elde edecektir

var global = this;
var sillyFunction = function (recursed) {
    if (!recursed)
        return arguments.callee(true);
    if (this !== global)
        alert("This is: "   this);
    else
        alert("This is the global");
}
sillyFunction();

Neyse, ECMA 3 giderilmiş işlev ifadeleri adında vererek bu sorunlar, örneğin:

 [1,2,3,4,5].map(function factorial(n) {
     return (!(n>1))? 1 : factorial(n-1)*n;
 });

Bu sayısız faydaları vardır:

  • İşlev kodu içinde herhangi çağrılabilir.

  • Ad kirleten değil.

  • this değerini değiştirmez.

  • Daha fazla ölçülebilir (arguments object erişim pahalıdır).

Hoppala,

Sadece soru üzereydi herşeyin ötesinde arguments.callee.caller, ya da daha spesifik olarak, bu fark Function.caller.

Herhangi bir noktada zaman bulabilirsiniz en derin arayan herhangi bir fonksiyon yığını, ve dediğim gibi yukarıda, bakıyorsun çağrı yığını var bir tek büyük etkisi: Bunu yapan çok sayıda iyileştirmeler imkansız, ya da çok çok daha zor.

Örn. eğer bir fonksiyon f bilinmeyen bir işlev çağrısı olmayacağını garanti edemez eğer, o zaman mümkün f satır içi değildir. Temelde basit olabilir, ama Ara sitesi inlinable nöbetçiler, alın: çok sayıda birikir anlamına gelir

 function f(a, b, c, d, e) { return a ? b * c : d * e; }

Eğer js yorumlayıcısı garanti edemez tüm sağlanan argümanlar numaralarından noktası çağrı yapıldı, ihtiyacı da Ekle çekler için tüm argümanları önce inlined kodu, ya da satır içi işlevi.

Şimdi bu durumda akıllı bir tercüman çekleri daha iyi olması ve kullanılacak olan tüm değerleri kontrol için yeniden düzenlemek gerekir. Ancak birçok durumda bu mümkün değil ve bu nedenle imkansız satıriçi olur.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • happyjpy

    happyjpy

    22 AĞUSTOS 2009
  • Jason Parker

    Jason Parker

    14 Aralık 2009
  • RomanAtwood

    RomanAtwood

    18 Kasım 2009