2012-04-11 15 views
6

In javascriptwindow è l'oggetto globale, il che significa che ogni oggetto nell'ambito globale è figlio di window. Allora, perché ottengo questo risultato:ReferenceError e l'oggetto globale

console.log(window.foo); // No error, logs "undefined". 
console.log(foo);  // Uncaught ReferenceError: foo is not defined. 

Fiddle

Queste due linee dovrebbe essere la stessa, non dovrebbero?

risposta

17

Perché con window.foo si sta cercando esplicitamente foo proprietà di window oggetto che non è il caso in quest'ultima opzione. Nell'ultima opzione, se foo non è definito, dovresti essere in grado di sapere che non è definito e ottenere l'avviso di errore libero piuttosto che l'interprete impostandolo su undefined da solo (come nel primo caso) che guiderà a risultati imprevisti.

Reference Error:

Rappresenta un errore quando si fa riferimento una variabile inesistente. Viene generato un errore ReferenceError durante il tentativo di dereferenziare una variabile che non è stata dichiarata.

Date un'occhiata a questo articolo per ulteriori informazioni:

Citando dall'alto articolo:

Un riferimento è considerato irrisolvibile se il suo valore di base non è definito. Pertanto un riferimento di proprietà è irrisolvibile se il valore prima del punto non è definito. L'esempio seguente lancia un ReferenceError ma non lo fa perché TypeError arriva prima. Questo perché il valore di base di una proprietà è soggetto a CheckObjectCoercible (ECMA 5 9.10 tramite 11.2.1) che genera un'eccezione TypeError quando si tenta di convertire un tipo non definito in un oggetto.

Esempi:

var foo; 
foo.bar; //TypeError (base value, foo, is undefined) 
bar.baz; //ReferenceError (bar is unersolvable) 
undefined.foo; //TypeError (base value is undefined) 

riferimenti che non sono né le proprietà o le variabili sono per definizione irrisolvibile e getterà un ReferenceError, così:

foo; //ReferenceError 
2

Nel primo esempio (window.foo) si accede a una proprietà dell'oggetto finestra. JavaScript restituisce "non definito" per quando si sta tentando di accedere a una proprietà inesistente di un oggetto. È progettato in questo modo.

Nel secondo esempio si fa riferimento direttamente a una variabile e, poiché non esiste, viene generato un errore.

È proprio il modo in cui JavaScript è progettato e funziona.

1

In JavaScript è possibile assegnare campi oggetto al volo così, quindi window.foo è quasi (vedi commenti sotto) equivalente a var foo;quando definito nel contesto globale, mentre solo chiamando il numero foo dal blu rende il panico del browser "perché non sa nemmeno quale oggetto cercare. Nota, se lo fai:

//when in global context, 'var' sets a property on the window object 
var foo; 

console.log(foo); 
//it will then also log `undefined` instead of throwing the error. 

//if you then do: 
foo = "abbazabba"; 

console.log(window.foo); 
// it will return "abbazabba" 
+1

'window.foo' non è equivalente a' var foo'. –

+0

@TimDown. puoi elaborarne altri per favore? forse in una risposta? – gdoron

+0

@TimDown & @gdoron Ok, questo è un po 'falso - volevo dire che window.foo è equivalente a 'var foo' quando dichiarato nel contesto globale. – JKing