2011-03-21 25 views
24

A continuación tenemos un IIFE que (como cualquier función) crea un ámbito local. Dentro de ese alcance hay una función parseInt. Ahora, dado que ya existe una función global en el navegador con ese nombre, la función local eclipsará la función global parseInt - dentro de la IIFE cualquier llamada al parseInt llamará a la función local, y no a la función global. (La función global todavía se puede hacer referencia a window.parseInt.)Sombreado variable en JavaScript

parseInt('123', 10); // the browser function is called 

(function() { 

    function parseInt() { return 'overshadowed'; } 

    parseInt('123', 10); // the local function is called 

})(); 

parseInt('123', 10); // the browser function is called 

¿Existe un jure (ECMAScript especificación) o facto nombre de (común) para esto? ¿Overshadowing? Sobrecarga?

Respuesta

33

El término correcto es [Variable] Shadowing

En la programación informática, ensombrecimiento variable aparece cuando una variable declarada dentro de un cierto alcance (bloque de decisión, el método o clase interna) tiene el mismo nombre que una variable declarado en un ámbito externo. se dice Esta variable exterior para ser sombreada ...

Funciones en JavaScript son sólo de función-objetos almacenados dentro de variables (o propiedades) que siguen las mismas reglas de cadena alcance/resolución como variables normales (o propiedades). Esto explica por qué todavía se puede acceder al original como window.parseInt. Es el "IIFE" el que introduce este nuevo ámbito (las funciones son la única forma de introducir un nuevo alcance en JavaScript).

Sin embargo, el ECMAScript Specification [5th Edition] no utiliza el término sombreado, ni puedo encontrar un término de reemplazo específico. (El fundamental comportamiento sombreado se define en "10.2.2.1 GetIdentifierReference" y secciones relacionadas.)

Es nosobrecarga y es noanulando, que son totalmente diferente. No tengo idea de dónde se originó eclipsando (en este contexto) o cómo se diferencia del "normal" [variable] sombreado. Si el término sombra no existen ya para explicar este comportamiento después - de un punto de vista idioma Inglés de todos modos - eclipsando ("para hacer insignificantes/intrascendente") podría ser más apropiado que sombra ("para emitir sombra sobre/oscurecer ").

Happy coding.

+0

'las funciones son la única forma de introducir un nuevo ámbito en JavaScript' excepto * con *, * eval * y * Function() *, que modifican el alcance. – RobG

+0

En ES6, if/for blocks puede introducir un nuevo alcance, al igual que las clases. De todos modos, creo que "sombra" es (mucho) mejor que "sombra". La definición relevante no es "lanzar sombra sobre/oscurecer", sino más bien "seguir (en la sombra de alguien)". –

9

Si sucedió por accidente/error, lo llamaría clobbering el parseInt() original.

De lo contrario, creo que lo vi referido a sombreado recientemente aquí en Stack Overflow.

+1

+1 Es solo * shadowing * (el término se usa en C, Scala, Java, etc.no sé qué jerga en Lisp-land es), aunque * cloquear * puede parecer más apropiado a veces. Es ** no ** * sobrecarga *. –

+0

@pst Definitivamente, si redefinir 'parseInt()' :) – alex

+0

clobbering ("sobrescribir sus contenidos") implicaría que ha cambiado el valor de la variable en el ámbito externo, por lo que no creo que esto tenga sentido en este contexto. – codemagician

4

Más comúnmente llamado "sombreado".

Cuestiones relacionadas