2012-05-07 10 views
5

Questo script ha un comportamento diverso a seconda che è gestito dalla shell nodo js o memorizzato in un file di script passato al nodo.Perché le funzioni non sono disponibili nell'oggetto globale?

Script:

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

uscita in guscio (solo ultime 4 righe sono rilevanti IMO ciascuna delle 3 linee erano copia/sequenziale incollato in un'istanza nodo REPL esecuzione in Terminal su 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 

uscita quando eseguito come uno script salvato (chiamato node myscript.js da bash su Mac OS X):

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

Perché sono diversi, e perché il mio script non possono vedere a e b in global?

EDIT: Aggiunta di un ulteriore economico c = 2 cambiato l'uscita. c era visibile in entrambi i metodi di esecuzione dello script. Tuttavia, ciò non spiega la presenza di aeb durante l'esecuzione dello script dalla shell.

+1

si può aggiungere al vostro esperimento: 1) L'assegnazione variabile senza 'var': Quindi basta fare una' c = 3'; 2) 'console.log (this === global)' –

+0

Puoi anche descrivere dettagliatamente come passare questi file al nodo? (Le esatte righe di comando) –

+0

Fatto. Qualcos'altro Ates? – Trindaz

risposta

4

Fondamentalmente è perché REPL del Node utilizza il contesto "globale" poiché è "questo" (è possibile testarlo con global === this).

Tuttavia, i moduli regolari gestiscono nel loro chiusura separata. Così si può immaginare che sia qualcosa di come questo:

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

Quindi, quando si definisce un var nella tua e eseguirlo come uno script, si sta in realtà solo definendo all'interno di una chiusura di funzione. Ma nella REPL, stai definendo la var a livello globale.

+0

Grazie @TooTallNate. Quando si sostituisce '(per var k in global)' con '(per var k in questo)' non stampa nulla. Qualche suggerimento su come posso scorrere i simboli creati dal mio script? – Trindaz

+0

All'interno di un modulo, 'this' punta al' exports' del modulo, non al contesto globale. Tuttavia, ritengo che non ci sia semplicemente modo di ripetere le variabili di chiusura. È solo una limitazione di JavaScript. – TooTallNate

+0

@TooTallNate È possibile utilizzare la forza bruta per iterare su tutte le combinazioni di nomi di variabili: P –

Problemi correlati