İşlev nesnesinin davranışını geçersiz kılabilir, böylece her işlev çağrısından önce davranışı enjekte edebilir ve sonra normal olarak devam edebilir miyim? Özellikle, (genel fikir kendi içinde ilgi çekici olsa da) her yerde konsol.log ifadeleri eklemek zorunda kalmadan konsola her işlev çağrısında oturum açabilir miyim? Ve sonra normal davranış devam ediyor?
Umarım mümkün değil :-) - stefan
Şimdiden burada cevaplandı: stackoverflow.com/questions/5033836/... - Wayne Burkett
Gördüm ki ... tam aradığım şeyi yapmıyor. Tüm işlev çağrılarına bağlanan bir şey istiyorum, ki bu sadece global ad alanına çarpıyor ve aşağı inmiyor. Ben daha iyi bir cevap bulamazsam, işi tekrar tekrar yapmak için bir üs olarak kullanacağım, ancak bu, Function nesnesinin kendisinin ayarlanmasıyla yapılıp yapılamayacağını bilmek istiyorum. - Matthew Nichols
Teknik olarak, bu konuda gitmenin yolu muhtemelen bir wrapper yöntemi ile Function.prototype.call geçersiz kılmak olacaktır. Bunu Chrome konsolundan yaparsanız, yazdığınız sırada günlüklerin göründüğünü görürsünüz (yazdığınız şeyi değerlendirmek için işlevleri çalıştırır.) Ancak, gerçek bir sayfaya koymaya çalışırsanız, olağanüstü bir şekilde patlar. - Nathan Ostgard
@ Nathan .. Eğer bir kod örneği bir cevap olarak koyarsanız, büyük bir olasılıkla şişirilmiş olsun ya da olmasın kabul edilmiş olarak işaretleyeceğim, çünkü bu tam olarak aradığım derin mekaniğin bir türüdür. - Matthew Nichols
Açık cevap, aşağıdaki gibi bir şeydir:
Ama bu aslında hemen sonsuz bir döngüye giriyor, çünkü çok çağrı çağrısı console.log çağrıları yürüten bir işlev çağrısı yürütür console.logBir işlev çağrısını yürüten console.log, hangi...
Olduğum nokta, bunun mümkün olduğundan emin değilim.
Sonsuz döngü problemini çözmek için, Function#caller eşittir Function#call ve bu durumda console.log aramak. - Mathias Bynens
Aslında, burada geçersiz kıldığınız Function.prototype öğesinden devralındığı gibi, özyineyi tetikleyen Array.prototype.slice.call (...). Function.prototype.call (...), "console.log (...); çalıştırdığınızda kullanılmaz." - Dan Phillimore
Sadece bunun yerine bir for döngüsü ile yineleyin. - Benjamin Gruenbaum
Fonksiyon çağrılarını engelleme
Buradaki birçok kişi geçersiz kılmaya çalıştı. Bazıları başarısız oldu, bazıları başarılı oldu. Bu eski soruya, iş yerime getirildiği için, bu yazı referans olarak kullanıldığından yanıt veriyorum.
Değiştirmemiz için yalnızca iki işlev çağrısı ile ilgili işlev vardır: .kall ve .apply. Her ikisinin de başarılı bir şekilde geçersiz kılınacağını göstereceğim.
TL; DR: OP'nin sorması mümkün değildir. Cevaplardaki başarı raporlarının bazıları, araya girme isteğimiz yüzünden değil, değerlendirmeden önce dahili olarak arama yapan konsoldan kaynaklanmaktadır.
Geçersiz kılma Function.prototype.call
Bu insanların ortaya koyduğu ilk fikir gibi görünüyor. Bazıları diğerlerinden daha başarılı oldu, ancak işte çalışan bir uygulama:
Bu başarıyla Function.prototype.call kesişir
Bir spin için alsak, olur mu?
Bunun bir konsoldan çalıştırılmaması önemlidir. Çeşitli tarayıcılarda, çağrı yapan her türlü konsol aracı bulunur. çokŞu anda bir kullanıcıyı karıştırabilecek, her giriş için bir kez de dahil olmak üzere. Diğer bir hata da, konsolidasyona yönelik bir argüman olan, konsolidasyon argümanı ile ilgili olan, sadece sonsuz bir döngüye neden olan konsol.log argümanlarıdır.
Function.prototype.apply da geçersiz kılma
Peki, peki ya o zaman? Sahip olduğumuz tek sihirli çağrı işlevleri onlar da bunu deneyelim. İşte ikisini de yakalayan bir versiyona gider:
... Ve deneyelim!
Gördüğünüz gibi, arayan parantez fark edilmeden gider.
.Call / .apply'u geçersiz kılan tek şey, bu prototip işlevlerine açık çağrıları engellemektir. Konsol, bu hack ile kullanıldığında, çok ve çok sayıda spam olacaktır. Ayrıca, eğer kullanıldıysa, konsol API'sinin hızlı bir şekilde sonsuz bir döngüye neden olabileceğinden (konsol.log, dahili olmayan bir dizge verirse dahili olarak kullanılabilir.) Kullanıldığında çok dikkatli olunmalıdır.
Hangi tarayıcıda? Ben sadece test ettim (son blobunu yapıştırın ve "şunu deneyin" kodunu çalıştırın) ve beklendiği gibi çalışır ...? - Kenny
Şey, şey bu Kullanılmış motorların eski versiyonlarında çalışmak. Çağrıyı geçersiz kıl ve yakalamak için kullanılır herşey işlev çağrıları. Bu daha yeni tarayıcı sürümlerinde düzeltildi. - Benjamin Gruenbaum
BAZI sonuçlar alıyorum ve aşağıdakilerle hiçbir sayfa çöküyor:
Yalnızca Chrome sürüm 9.xxx'te test edildi.
Bu kesinlikle tüm işlev çağrılarını kaydetmiyor, ancak bazılarını günlüğe kaydediyor! Şüpheliyim ki, sadece 'çağrı' ile ilgili gerçek çağrılar işleniyor
Teşekkürler! Bu kodun bir kısmını, formatı ve konsol.log'a bağlanan bir şeyde kullandı. autolog.js. Deneyin ve ne düşündüğünüzü bana bildirin! Hala çok iş gerekiyor. - Gary S. Weaver
Teşekkürler, cevabımı bulabilirsiniz stackoverflow.com/questions/6921588 ayrıca yardımcı olur. - HBP
@ GaryS.Weaver - autolog'unuz bunu Chrome'da tekrar tekrar konsolumda yazdırmaya devam etsin: [object Arguments].slice () source: at Function.function_prototype_call_override (<anonymous>:76:17) [object HTMLBodyElement].anonymous ((object)[object Object], (object)[object Object],[object Object]) source: at Function.function_prototype_call_override (<anonymous>:76:17) - Johannes
@Johannes Bazı kütüphanelerle benzer sorunlarla karşılaştım. 'Uygula' işlevi tekrar 'ara' diyebilir ve bir döngüde sıkışır. Kodun kendisi için konsola giriş yapmanın daha iyi bir yaklaşıma yol açabileceğine karar verdim: github.com/garysweaver/noisify Not: autolog / etc'deki problemlerle gelecekteki yardım için. açmak konu Github projesinde. Rapor için teşekkürler. - Gary S. Weaver
@ GaryS.Weaver - evet noisify gördüm ama bir JS çözümü arıyordum. Yine de teşekkürler ve bana geri döndüğün için teşekkürler. - Johannes
Sadece hızlı bir test, ama benim için çalışıyor gibi görünüyor. Bu şekilde işe yaramayabilir, ama benim ikamemin bedeninde iken prototipi eski haline getiriyorum ve daha sonra çıkmadan önce “geri almamalıyım”.
Bu örnek sadece tüm işlev çağrılarını kaydeder - yine de tespit etmem gereken bazı ölümcül kusurlar olabilir; bunu bir kahve molası sırasında yapıyor
Büyük bir macunta yapılan aramalar dahil olmak üzere bazı sorunlar yaşadım, bu nedenle yukarıdaki işlevleri test etmek için REPL'e yazdıklarımı yazdım:
Geçersiz kılınabilir Function.prototype.callsadece sadece emin ol apply geçersiz kılma içindeki işlevler.
Şimdi eğer yerel işlevlerin nasıl filtreleneceğini anlayabilseydim ... - colllin
davidwalsh.name/detect-native-function yerel işlevleri algılamak için - Christopher Roy
Linux için ücretsiz web sitesi wireframing aracı [kapalı] Yeni ios7'de kullanılamaz UDID (FFFFFFFF öneki ile) sed + bir sed komutuyla “#” ve boş satırları kaldır Symfony2 - dizi dönüştürme hatası dizisi Hata Ayıklama Yapılmamış Yapılarda Android Gradle Koşu Testleri ORA-01843 geçerli bir ay değil - Karşılaştırma Tarihleri bir tabloyu diğerinden veri ile güncelle