Hari ini saat menulis kode menggunakan garis bawah dan tulang punggung saya harus membungkus beberapa fungsi. Saya melihat contoh berikut di underscorejs.org
var hello = function (name) {return "hello:" + name; };
halo = _.wrap (halo, fungsi (func) {
return "before," + func ("moe") + ", after";
});
Halo();
=> 'sebelumnya, halo: moe, setelah'
di baris terakhir kedua
bagaimana jika pemanggilan fungsi seperti
halo ("umar");
Maksud saya, argumen datang dari luar.
Bungkus sudah menangani sebagian besar ini untuk Anda. Sumber bungkus cukup singkat untuk dibaca. Itu atau Anda dapat melihat contoh tambahan di bawah ini:
var greet = function(name, language){
var response
if (language === "sp") {
response = "Hola"
} else if (language === "fr") {
response = "Bonjour"
} else {
response = "Hello"
}
return response + " " + name
}
greet("Ted", "fr"); // => "Bonjour Ted"
greet = _.wrap(greet, function(old_greet, lang){ return old_greet("Ted", lang); } );
greet("sp"); // => "Hola Ted"
Terima kasih atas tanggapan cepat ini. Itu sangat membantu.
Saya menggunakan tulang punggung untuk mengembangkan aplikasi perusahaan.
view.js
var view = Backbone.View.extend ({
authorizeCreateAction: function () {
// di sini "ini" menunjuk untuk dilihat
this.createAlert: _.wrap (this.createAlert, function (_createAlert, _type) {
// otorisasi buat tindakan
return _createAlert (_type);
});
},
createAlert: function (type) {
//MASALAH:
// Di sini "ini" mengarah ke [window global]
}
});
lihat di dalam fungsi createAlert ketika saya memanggil fungsi createAlert secara langsung, itu menunjuk ke tampilan tetapi ketika saya menulis fungsi pembungkus itu mulai menunjuk ke [window global]
Saya ingin mengubah referensi ini menjadi menunjuk ke "tampilan"
Saya baru menggarisbawahi, abaikan jika pertanyaan tidak relevan.
Garis bawah BTW mengagumkan
Anda harus menelepon _createAlert
dengan konteks seperti di bawah ini. Semoga membantu. :)
return _createAlert.call(this, _type);
tampaknya garis bawah _wrap hanya mendukung satu parameter, gunakan ini sebagai gantinya:
fn = (function (fn, before, after, self) {
fungsi kembali () {
if (before) before.apply (self, arguments);
var res = fn.apply (self, arguments);
if (after) after.apply (self, arguments);
res kembali;
}
}) (fn, sebelum, sesudah, ini)
Anda juga dapat menggunakan parsial untuk zarehb itu
tnx megawac, parsial lebih untuk mengisi argumen yang tidak memanggil fungsi sebelum dan sesudah
Bungkus diimplementasikan melalui _.partial
fyi
fn = _.partial(function(fn, before, after, self) {
var args = _.rest(arguments, 4);
if (before) before.apply(self,args);
var res = fn.apply(self,args);
if (after) after.apply(self,args);
return res;
})(fn, before, after, this )
itu benar dan itu akan berhasil, tetapi jika ada yang menginginkan solusi js murni dapat mengambil milik saya khususnya bahwa menggunakan garis bawah tidak memberi Anda manfaat apa pun dalam kasus ini!