Saltar al contenido

Javascript: reasignar una función con otra función

Este team de expertos pasados algunos días de investigación y recopilación de de datos, dieron con la solución, deseamos que todo este artículo sea de utilidad para tu trabajo.

Solución:

La asignación a la fn el argumento solo hace que ese identificador apunte a la función anónima, foo en el ámbito exterior no se ve afectado.

Cuando pasa un objeto como argumento, se puede decir “las referencias se pasan por valor”. La asignación simplemente reemplaza la ubicación donde el fn se refiere el identificador.

Así es como el estrategia de evaluación funciona en JavaScript.

Justo antes de la asignación en el fnChanger funciones, los dos identificadores, el global foo y el fn argumento, apunte al mismo objeto de función:

                ---------------------------------------------
    foo ----->  |function foo  sys.print('Un changed!');  |
                ---------------------------------------------
                   ^
                   |
    fn -------------

Después de la asignación, fn simplemente apuntará a la nueva función:

                ---------------------------------------------
    foo ----->  | function foo  sys.print('Unchanged!');  |
                ---------------------------------------------

                ---------------------------------------
    fn ------>  | function  sys.print('Changed!');  |
                ---------------------------------------

¿Cómo podrías cambiarlo?

Bueno, suponiendo que foo es una función en el ámbito global, podría hacer algo como esto:

function fnChanger(obj, name) 
    obj[name] = function()  sys.print('Changed!'); ;


function foo() 
    sys.print('Unchanged');


fnChanger(this, 'foo');
foo(); // Changed!

Lo anterior funcionará porque en el fnChanger función, necesitamos un objeto básico y un nombre de la propiedadlas funciones declaradas en el contexto de ejecución global están vinculadas como propiedades del Objeto globalpor lo tanto podemos reasignar su valor de esa manera.

La línea fnChanger(this, 'foo'); debe ejecutarse también en el ámbito Global, pasará el this valor (que se refiere al objeto Global en este ámbito) y un nombre de propiedad, lo que le permite realizar una asignación al GlobalObject.foo identificador

Si ese código estuviera dentro de una función, no hay forma de que podamos obtener un objeto baseporque en este “Contexto de ejecución de código de función”, las declaraciones de funciones (declaraciones de variables y parámetros formales de funciones también) están vinculadas como propiedades de un objeto no accesiblellamado Objeto Variable (una cadena de estos Objetos Variables, forma la Cadena de Ámbito), y si fuera el caso, la única solución sería usar eval.

Más información:

  • ECMA-262-3 en detalle. Capítulo 8. Estrategia de evaluación.

Como señaló @CMS, no puede asignarlo dentro de la función debido al alcance. Sin embargo, podrías reasignarlo así:

var fnChanger = function() 
  return function() 
      alert('changed!');
  


var foo = function() 
  alert('Unchanged');


foo = fnChanger();
foo();

ejemplo

Sección de Reseñas y Valoraciones

Recuerda algo, que puedes permitirte añadir una valoración justa si descubriste tu rompecabezas en el momento oportuno.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *