2012-05-07 10 views
5

Este script tiene un comportamiento diferente en función de si se ejecuta desde el shell del nodo js o si se almacena en un archivo de script que se pasa al nodo.¿Por qué las funciones no están disponibles en el objeto global?

Guión:

var a = 1; 
function b(){return 1;} 
for(var k in global) console.log(k); 

salida en shell (sólo últimos 4 líneas son relevantes OMI Cada una de las 3 líneas eran copia/secuencialmente pegado en una instancia de nodo REPL ejecuta en Terminal en Mac OS X.):

ArrayBuffer 
Int8Array 
Uint8Array 
Int16Array 
Uint16Array 
Int32Array 
Uint32Array 
Float32Array 
Float64Array 
DataView 
global 
process 
GLOBAL 
root 
Buffer 
setTimeout 
setInterval 
clearTimeout 
clearInterval 
console 
module 
require 
a 
_ 
b 
k 

de salida cuando se ejecuta como un script guardado (llamado node myscript.js de fiesta en Mac OS X):

ArrayBuffer 
Int8Array 
Uint8Array 
Int16Array 
Uint16Array 
Int32Array 
Uint32Array 
Float32Array 
Float64Array 
DataView 
global 
process 
GLOBAL 
root 
Buffer 
setTimeout 
setInterval 
clearTimeout 
clearInterval 
console 

¿Por qué son diferentes y por qué mi script no puede ver a y b en global?

EDITAR: Agregar una declaración adicional c = 2 cambió la salida. c era visible en ambos métodos de ejecución del script. Sin embargo, esto todavía no explica la presencia de a y b al ejecutar el script desde el shell.

+1

Puede agregar a su experimento: 1) Una asignación de variable sin 'var': Haga una' c = 3'; 2) 'console.log (this === global)' –

+0

¿Puede también detallar cómo pasa estos archivos al nodo? (Las líneas de comando exactas) –

+0

Hecho. ¿Algo más, Ates? – Trindaz

Respuesta

4

Básicamente es porque el REPL de Node usa el contexto "global" ya que es "esto" (puede probarlo con global === this).

Sin embargo, los módulos regulares se ejecutan en su propio cierre por separado. Así que usted puede imaginar que es algo así:

function (module, exports, global) { 
    // your module code 
} 

Así que cuando se define una var en tu y ejecutarlo como un script, en realidad está justo definirlo en el interior de un cierre de función. Pero en el REPL, estás definiendo la var a nivel global.

+0

Gracias @TooTallNate. Al reemplazar '(para var k en global)' con '(para var k en esto)' no imprime nada. ¿Alguna pista sobre cómo puedo iterar a través de símbolos creados por mi script? – Trindaz

+0

Dentro de un módulo, 'this' apunta a las' exportaciones' del módulo, no al contexto global. Sin embargo, creo que simplemente no hay forma de iterar en las variables de cierre. Es solo una limitación de JavaScript. – TooTallNate

+0

@TooTallNate Puede usar la fuerza bruta para iterar sobre todas las combinaciones de nombres de variables: P –

Cuestiones relacionadas