2010-10-19 8 views
7

Sono un principiante confuso. Ho letto in un tutorial che si crea un oggetto JavaScript in questo modo:Qual è la differenza tra dichiarare oggetti javascript con var vs. con funzione?

function myObject() { 
    this.myProperty = "a string"; 
    this.myMethod = function() { 
     //Method code 
    } 
} 

Poi ho letto da qualche altra parte che si crea un oggetto in questo modo:

var myObject = { 
    myProperty: "a string", 
    myMethod : function() { 
     //Method code 
    } 
} 

Qual è il (non-soggettiva) differenza tra i due? Esiste un modo giusto ufficiale e un modo sbagliato?

risposta

5

Entrambe le dichiarazioni sono corrette ma hanno semantica diversa.

Il primo tipo di dichiarazione consente di creare istanze di oggetti:

var t = new myObject(); 
// then use t 
t.myProperty = "some value"; 

var otherT = new myObject(); 
otherT.myProperty = "some other value"; 

Il secondo è quasi come un oggetto statico :

myObject.myProperty = "some value"; 
+1

preferisco chiamare il secondo un * singleton * senza un costruttore. – galambalazs

+0

Grazie per averlo confrontato con un oggetto statico. È un ottimo modo per spiegarlo. – randomable

3

Ecco un confronto diretto ..

function myObject() { 

Questo dichiara la funzione quando JavaScript è analizzato ...

var myObject = function() { 

Questo dichiara la funzione in fase di esecuzione.

Se si utilizza il metodo "var", la funzione deve essere dichiarata prima di utilizzarla ... provare questo esempio.

myFunction(); // Works 
myVarFunction(); // Boom 

var myVarFunction = function() { alert("Hi"); }; 

function myFunction() { alert("Hi"); }; 

Quindi perché utilizzare il metodo "var" se si deve fare più attenzione ad usarlo? Tutto ha a che fare con l'ambito ... le funzioni con scope sono considerate migliori.

UPDATE: E ci sono alcune grandi spiegazioni:

var functionName = function() {} vs function functionName() {}

+0

Grazie per il link! Una risposta ha detto che var era circoscritto, ma un'altra risposta lo ha corretto, dicendo che entrambi hanno lo scopo. L'ho provato, e mi sembra che sia la var che la funzione hanno lo stesso effetto. O c'è qualche altra condizione in cui non lo fanno? – randomable

+0

@randomable: sì, lo scope in questo scenario sembra causare confusione ... Potrei essere un'altra vittima. Controlla questo: https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope – Fenton

0

La principale differenza tra i due è che una variabile è locale e l'altro è globale. "Var" fondamentalmente definisce l'ambito della variabile.

Quando aggiungiamo var a un'assegnazione di valori di variabile, javascript assicura che la variabile sia confinata a qualsiasi funzione a cui è assegnata e non collida con la stessa variabile di nome all'interno di un'altra funzione.

Quando non si utilizza var, viene dichiarato come funzione globale e possono verificarsi possibilità di collisione. Quindi è sempre consigliabile utilizzare "var" prima dell'assegnazione del valore variabile. Se necessario, utilizzare una funzione anonima per la chiusura.

Problemi correlati