Saya memiliki fungsi,, a()
yang ingin saya timpa, tetapi juga yang asli a()
dilakukan dalam urutan tergantung pada konteksnya. Misalnya, kadang-kadang ketika saya membuat halaman saya ingin menimpa seperti ini:
function a() {
new_code();
original_a();
}
dan terkadang seperti ini:
function a() {
original_a();
other_new_code();
}
Bagaimana saya mendapatkan itu original_a()
dari dalam perjalanan a()
? Apakah itu mungkin?
Tolong jangan menyarankan alternatif untuk naik dengan cara ini, saya tahu banyak. Saya bertanya tentang cara ini secara khusus.
(functi..
dan})
. Melakukan saja}();
akan menghasilkan hasil yang sama, seperti(function{})()
set kurung pertama digunakan karena Anda tidak bisa mendeklarasikan, anonim, ekspresi fungsi yang Anda harus tetapkan. Tetapi dengan melakukan () Anda tidak mendefinisikan apa pun hanya mengembalikan fungsi.a
, tidak memanggilnya dan menyimpan nilai kembali. Tanda kurung memberi tahu saya ada sesuatu yang terjadi.The Pola Proxy mungkin membantu Anda:
sumber
Terima kasih kawan, pola proksi sangat membantu ..... Sebenarnya saya ingin memanggil fungsi global foo .. Di halaman tertentu saya perlu melakukan beberapa pengecekan. Jadi saya melakukan yang berikut.
Terima kasih, ini sangat membantu saya
sumber
org_foo(args)
, panggilorg_foo.call(this, args)
. Itu tetapthis
seperti ketika window.foo panggilan normal (tidak proksi). Lihat Jawaban iniAnda dapat mengganti fungsi menggunakan konstruksi seperti:
Sebagai contoh:
Sunting: Memperbaiki kesalahan ketik.
sumber
Melewati argumen sewenang-wenang:
sumber
original_a
?Jawaban yang diberikan @Matthew Crumley adalah memanfaatkan ekspresi fungsi yang segera dipanggil, untuk menutup fungsi 'a' yang lebih lama ke dalam konteks eksekusi dari fungsi yang dikembalikan. Saya pikir ini adalah jawaban terbaik, tetapi secara pribadi, saya lebih suka meneruskan fungsi 'a' sebagai argumen ke IIFE. Saya pikir itu lebih bisa dimengerti.
sumber
Contoh di atas tidak berlaku
this
atau lulusarguments
dengan benar ke fungsi menimpa. Garis bawah _.wrap () membungkus fungsi yang ada, berlakuthis
dan diteruskanarguments
dengan benar. Lihat: http://underscorejs.org/#wrapsumber
Saya memiliki beberapa kode yang ditulis oleh orang lain dan ingin menambahkan baris ke fungsi yang tidak dapat saya temukan dalam kode. Jadi sebagai solusi saya ingin menimpanya.
Tidak ada solusi yang bekerja untuk saya.
Inilah yang berhasil dalam kasus saya:
sumber
Saya telah membuat pembantu kecil untuk skenario yang sama karena saya sering perlu mengganti fungsi dari beberapa perpustakaan. Helper ini menerima "namespace" (wadah fungsi), nama fungsi, dan fungsi utama. Ini akan menggantikan fungsi asli di namespace yang dirujuk dengan yang baru.
Fungsi baru menerima fungsi asli sebagai argumen pertama, dan argumen fungsi asli sebagai sisanya. Ini akan menjaga konteks setiap saat. Ini mendukung fungsi void dan non-void juga.
Penggunaan misalnya dengan Bootstrap:
Saya tidak membuat tes kinerja apa pun. Itu mungkin dapat menambahkan beberapa overhead yang tidak diinginkan yang bisa atau tidak bisa menjadi masalah besar, tergantung pada skenario.
sumber
Menurut pendapat saya, jawaban teratas tidak dapat dibaca / dipelihara, dan jawaban lainnya tidak mengikat konteks dengan benar. Berikut adalah solusi yang dapat dibaca menggunakan sintaks ES6 untuk menyelesaikan kedua masalah ini.
sumber
Jadi jawaban saya akhirnya menjadi solusi yang memungkinkan saya untuk menggunakan variabel _ ini menunjuk ke objek asli. Saya membuat contoh baru dari "Kotak" tetapi saya benci cara "Kotak" menghasilkan ukuran itu. Saya pikir itu harus mengikuti kebutuhan spesifik saya. Namun untuk melakukannya, saya membutuhkan kuadrat untuk memiliki fungsi "GetSize" yang diperbarui dengan internal fungsi yang memanggil fungsi lain yang sudah ada di alun-alun seperti this.height, this.GetVolume (). Tetapi untuk melakukannya saya perlu melakukan ini tanpa ada peretasan yang gila. Jadi, inilah solusi saya.
Beberapa fungsi penginisialisasi atau fungsi pembantu lainnya.
Berfungsi di objek lain.
sumber
Tidak yakin apakah itu akan berfungsi dalam semua keadaan, tetapi dalam kasus kami, kami mencoba untuk menimpa
describe
fungsi di Jest sehingga kami dapat mengurai nama dan melewatkan keseluruhandescribe
blok jika memenuhi beberapa kriteria.Inilah yang berhasil bagi kami:
Dua hal yang sangat penting di sini:
Kami tidak menggunakan fungsi panah
() =>
.Fungsi panah mengubah referensi ke
this
dan kami membutuhkannya menjadi filethis
.Penggunaan
this.describe
danthis.describe.skip
bukannya adildescribe
dandescribe.skip
.Sekali lagi, tidak yakin itu bernilai bagi siapa pun, tetapi kami awalnya mencoba untuk lolos dengan jawaban Matthew Crumley yang sangat baik, tetapi perlu membuat metode kami berfungsi dan menerima params untuk menguraikannya dalam kondisi.
sumber