valor una tipos retornar pasar parametros otra globales funciones funcion desde dentro anonimas javascript functional-programming scope ecma262

tipos - retornar valor de una funcion javascript



¿Cuál es el alcance de una función en Javascript/ECMAScript? (5)

...

function a() { function b() { alert(''boo'') } var c = ''Bound to local call object.'' d = ''Bound to global object.'' }

sin ser precedido por var , d es global. Haz esto para que sea privado:

function a() { function b() { alert(''boo'') } var c = ''Bound to local call object.'' var d = ''Bound to local object.'' }

Hoy tuve una conversación con un colega sobre funciones anidadas en Javascript:

function a() { function b() { alert(''boo'') } var c = ''Bound to local call object.'' d = ''Bound to global object.'' }

En este ejemplo, las pruebas señalan que b no es alcanzable fuera del cuerpo de a, al igual que c. Sin embargo, d es - después de ejecutar a (). Buscando la definición exacta de este comportamiento en el estándar ECMAScript v.3 , no encontré la redacción exacta que estaba buscando; lo que la Sec.13 p.71 no dice, es a qué objeto se debe vincular el objeto de función creado por la declaración de declaración de la función. ¿Me estoy perdiendo de algo?


Javascript tiene dos ámbitos. Global y funcional. Si declara una variable dentro de una función usando la palabra clave "var", será local para esa función y cualquier función interna. Si declara una variable fuera de una función, tiene alcance global.

Finalmente, si omite la palabra clave var cuando declara por primera vez una variable, javascript supone que desea una variable global, sin importar dónde la declare .

Entonces, estás llamando a la función a, y la función a declara una variable global d.


Parece importante tener en cuenta que, si bien d se está creando como un "global", en realidad se está creando como una propiedad del objeto ventana. Esto significa que podría sobrescribir inadvertidamente algo que ya existe en el objeto de la ventana o su variable podría no crearse en absoluto. Asi que:

function a() { d = ''Hello World''; } alert(window.d); // shows ''Hello World''

Pero no puedes hacer:

function a() { document = ''something''; }

porque no puede sobrescribir el objeto window.document.

Para todos los fines prácticos, puede obtener imágenes de que todo su código se ejecuta en un bloque gigante with(window) .


Esto es un alcance estático. Las declaraciones dentro de una función tienen un alcance dentro de esa función.

Sin embargo, Javascript tiene un comportamiento peculiar, que sin la palabra clave var , implica una variable global . Eso es lo que estás viendo en tu prueba. Su variable "d" está disponible porque es un global implícito, a pesar de estar escrito dentro del cuerpo de una función.

Además, para responder la segunda parte de su pregunta: existe una función en cualquier ámbito que se declare, al igual que una variable.

Nota: probablemente no desees variables globales, especialmente las implícitas. Se recomienda utilizar siempre la palabra clave var para evitar confusiones y mantener todo limpio.

Nota: El estándar ECMA no es probablemente el más útil para encontrar respuestas sobre Javascript, aunque ciertamente no es un mal recurso. Recuerde que javascript en su navegador es solo una implementación de ese estándar, por lo que el documento de estándares le dará las reglas que (en su mayoría) siguieron los implementadores cuando se creó el motor javascript. No puede ofrecer información específica sobre las implementaciones que le interesan, a saber, los principales navegadores. Hay un par de libros en particular que le brindarán información muy directa sobre cómo se comportan las implementaciones de javascript en los principales navegadores. Para ilustrar la diferencia, incluiré extractos a continuación de la especificación ECMAScript y un libro sobre Javascript. Creo que estarás de acuerdo en que el libro da una respuesta más directa.

Aquí está la especificación del lenguaje ECMAScript :

10.2 Introducción de un contexto de ejecución

Cada función y llamada de constructor entra en un nuevo contexto de ejecución, incluso si una función se está llamando recursivamente. Cada devolución sale de un contexto de ejecución. Una excepción arrojada, si no se captura, también puede salir de uno o más contextos de ejecución.

Cuando el control ingresa a un contexto de ejecución, la cadena de alcance se crea e inicializa, se realiza una instanciación variable y se determina este valor.

La inicialización de la cadena de ámbito, la creación de instancias variables y la determinación de este valor dependen del tipo de código que se ingrese.

El siguiente es de O''Reilly''s Javascript: The Definitive Guide (5th Edition) :

8.8.1 Alcance léxico

Las funciones en JavaScript son léxica en lugar de ámbito dinámico. Esto significa que se ejecutan en el ámbito en el que están definidos, no en el ámbito desde el que se ejecutan. Cuando se define una función, la cadena de alcance actual se guarda y se convierte en parte del estado interno de la función. ...

Altamente recomendado para cubrir este tipo de preguntas es el libro de Douglas Crockford:

JavaScript, The Good Parts http://oreilly.com/catalog/covers/9780596517748_cat.gif

Javascript, The Good Parts , también de O''Reilly.


Según tengo entendido, estos son equivalentes en lo que respecta al alcance:

function a() { ... }

y

var a = function() { ... }