Hoy, mientras escribía código con subrayado y columna vertebral, tuve que ajustar algunas funciones. Vi el siguiente ejemplo en underscorejs.org
var hola = función (nombre) {return "hola:" + nombre; };
hola = _.wrap (hola, función (func) {
return "antes", + func ("moe") + ", después";
});
Hola();
=> 'antes, hola: moe, después'
en la penúltima línea
¿Qué pasa si la llamada a la función es como
hola ("umar");
Quiero decir que los argumentos vienen de afuera.
Wrap ya se encarga de la mayor parte de esto por ti. La fuente de la envoltura es bastante corta de leer. Eso o puede echar un vistazo al ejemplo extendido a continuación:
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"
Gracias por esta rápida respuesta. Fue de mucha ayuda.
Estoy usando backbone para desarrollar una aplicación empresarial.
view.js
var view = Backbone.View.extend ({
AuthorizeCreateAction: function () {
// aquí "esto" apunta a ver
this.createAlert: _.wrap (this.createAlert, function (_createAlert, _type) {
// autorizar crear acción
return _createAlert (_type);
});
},
createAlert: function (type) {
//PROBLEMA:
// Aquí "esto" apunta a [ventana global]
}
});
ver dentro de la función createAlert cuando estaba llamando a la función createAlert directamente apuntaba a la vista, pero cuando escribí la función contenedora, comenzó a apuntar a [ventana global]
Quiero cambiar la referencia de esto para que apunte a "ver".
Soy nuevo en subrayar, ignore si la pregunta es irrelevante.
Por cierto, el subrayado es impresionante
Deberá llamar a _createAlert
con un contexto como el siguiente. Espero que ayude. :)
return _createAlert.call(this, _type);
parece que el subrayado _wrap solo admite un parámetro, use esto en su lugar:
fn = (función (fn, antes, después, self) {
función de retorno () {
if (antes) before.apply (self, argumentos);
var res = fn.apply (yo, argumentos);
if (después) after.apply (self, argumentos);
return res;
}
}) (fn, antes, después, esto)
También puedes usar parcial para ese zarehb
tnx megawac, parcial es más para rellenar previamente los argumentos sin llamar a una función antes y después
La envoltura se implementa a través de _.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 )
eso es correcto y funcionará, pero en caso de que alguien quiera una solución js pura, puede tomar la mía, especialmente, ¡el uso de subrayado no le brinda ningún beneficio en este caso!