Created
August 21, 2011 09:35
-
-
Save joseanpg/1160391 to your computer and use it in GitHub Desktop.
GEJS-4 memorizaParametro (aplicación parcial)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Function.prototype.memorizaParametro = function(parametro) { | |
var funcionSobreLaQueSeEjecuto_memorizaParametro = this; | |
return function() { | |
var argsArray = Array.prototype.slice.call(arguments,0);//Convertimos en array | |
argsArray.unshift(parametro); | |
return funcionSobreLaQueSeEjecuto_memorizaParametro.apply(this,argsArray); | |
} | |
} | |
//Primer ejemplo: uso puramente funcional | |
var alfa = function(uno,dos,tres) { | |
var r = uno+dos+tres; | |
console.log("Primer parametro: "+uno) | |
console.log("Resultado: "+r); | |
return r; | |
} | |
var beta = alfa.memorizaParametro(7);//Partial application | |
alfa(7,2,3); //Primer parametro 1, 6 | |
beta(2,3); //Primer parametro 7, 12 | |
//Segundo ejemplo: "metodo" de un objeto (usando this) | |
var bob = { | |
nombre:'Bob Esponja', | |
cocinar:function(receta,numero){ | |
var texto = '\u00A1 Yo '+this.nombre+' voy a preparar '+numero+' '+receta+' !'; | |
console.log(texto);return texto; | |
} | |
} | |
bob.cocinar('pizzas',20); //¡ Yo Bob Esponja voy a preparar 20 pizzas ! | |
console.log('\u00A1 Ese no es tu trabajo chico !'); | |
bob.cocinar = bob.cocinar.memorizaParametro('cangreburguers'); //Partial application | |
bob.cocinar(20); //¡ Yo Bob Esponja voy a preparar 20 cangreburguers ! | |
Para molestar a @joseanpg te voy a recomendar este link http://ejohn.org/apps/learn/#2
@joseanpg muchas gracias por la explicación, así da gusto preguntar :)
@juandopazo gracias por el link, lo conocía (tengo el libro en preorder) pero me falta estudiar un poco más antes de pegarme con el juguete de Resig ;)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
¡Interesantísima cuestión! Hay varios motivos por los cuales no se suele utilizar tu versión, que por otra parte debe funcionar correctamente.
Como seguramente sabrás
arguments
es un objeto interno acoplado con los parametros de la función de manera que si tocas el valor de un parámetro se actualiza el correspondiente elemento dearguments
y viceversa, esto plantea dos problemas:getElementsByTagName
, cuanto antes los conviertas en un auténtico y simple array mejor.arguments
permite jugar sucio a la función que lo recibe violando el Principle of Least Authority (POLA): la receptora toca un elemento delarguments
recibido y está alterando, por la cara, el correspondiente argumento de la función que la invocó, lo cual es una barbaridad, sobre todo en un entorno abierto como es la web con los scripts-tags trayendo código de todas partes. En este caso no importa, ya que la función a la que se pasará elarguments
está en Taill Call Position. Estamos a salvo por este lado pero ...... Pero existe otro peligro de violación de POLA:
arguments
tiene una propiedadcallee
que permitiría a la función receptora invocar a la función que la llamó. Y peor aún, en muchas implementaciones mediantearguments
es posible acceder acaller
y llamar a la del nivel superior.Por estos motivos no es buena práctica pasar
arguments
y se copian sus elementos naturales en un array normal.Por cierto, el Strict Mode de ECMAScript 5 carga a
arguments
de limitaciones para evitar todas estas posibilidades desagradables :)