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.