hai colpito su un paio di cose diverse qui , ma proverò a rispondere per prima cosa alla tua domanda principale.
In generale ....
function() { ... }
è un'espressione funzione di. Sintatticamente questo è allo stesso livello di 2
o [4,5]
. Questo rappresenta un valore . Così facendo var foo=function(){ ... }
funzionerà come pianificato, ogni volta.
function foo() { ... }
è una dichiarazione di funzione. Questo potrebbe sembrare fare la stessa cosa di var foo=function(){...}
, ma c'è un piccolo avvertimento. Essendo una dichiarazione, funziona in modo simile al concetto di sollevamento variabile in JS (in pratica tutte le dichiarazioni delle variabili vengono eseguite prima che qualsiasi espressione venga valutata).
Un buon esempio è da here:
function test() {
foo(); // TypeError "foo is not a function"
bar(); // "this will run!"
var foo = function() { // function expression assigned to local variable 'foo'
alert("this won't run!");
}
function bar() { // function declaration, given the name 'bar'
alert("this will run!");
}
}
test();
sollevamento Fondamentalmente variabile ha portato il valore fino alla cima, quindi questo codice è equivalente (in teoria) a:
function test() {
var foo;//foo hoisted to top
var bar=function(){//this as well
alert("this will run!");
}
foo(); // TypeError "foo is not a function"
bar(); // "this will run!"
var foo = function() { // function expression assigned to local variable 'foo'
alert("this won't run!");
}
}
NB: Mi piacerebbe prendere questo punto per dire che gli interpreti JS hanno difficoltà a seguire la teoria, quindi fidarsi di loro su un comportamento un po 'incerto r non è raccomandatoHere troverai un buon esempio alla fine di una sezione in cui teoria e pratica finiscono per non funzionare (ci sono anche alcuni dettagli sull'argomento delle espressioni vs dichiarazioni).
Fun fatto: avvolgendo function foo() {...}
tra parentesi la trasforma da una dichiarazione ad un'espressione, che può portare a qualche codice cercando strano come
(function foo() { return 1; })();// 1
foo; //ReferenceError: foo is not defined
Non farlo se non si dispone di un motivo per , per favore.
Sommariovar foo=function(){ ... }
è * sorta pò * la stessa funzione di foo(){ ... }
tranne che il primo fa quello che pensi lo fa in cui si pensa che dovrebbe, mentre la seconda fa cose strane a meno che non avvolgerlo in parentesi, ma gli interpreti JS ti permettono di fare cose che sono considerate errori di sintassi nelle specifiche così sei portato a credere che le cose sbagliate siano di fatto giuste, ecc ....
per favore usa la funzione espressioni (var f=function(){...}
). Non c'è una vera ragione per non farlo, specialmente considerando che sei un po 'forzato a farlo quando usi la sintassi del punto.
On per la seconda cosa hai toccato .....
Io non sono davvero sicuro di cosa dire, è un po sorta completamente diverso da tutto il resto di questo.
var foo = {
baz: 43,
doSomething:function() {
...
}
}
questo è noto come sintassi letterale dell'oggetto. JSON, che si basa su questa sintassi, è a pretty neat way of formatting data e questa sintassi in JS viene spesso utilizzata per dichiarare nuovi oggetti, ad esempio con oggetti singleton (evitando tutto il casino con la dichiarazione di una funzione e l'utilizzo di new). Può essere utilizzato anche nello stesso modo in cui viene utilizzato XML, ed è preferito da parte di tutti i bambini freschi ...
In ogni modo, in sostanza oggetto la sintassi letterale funziona così:
{ name1: val1, .... namek:valk }
questa espressione è un oggetto con alcuni valori inizializzati su di esso. Così facendo var obj={ name1: val1, .... namek:valk }
significa che:
obj.name1==val1;
obj['name1']==val1;// x['y'] is the same thing as x.y
...
obj.namek==valk;
Così che cosa questo ha a che fare con il nostro esempio? Fondamentalmente la tua espressione è spesso usata per dichiarare oggetti singleton. Ma può anche essere usato per dichiarare un prototipo di oggetto, quindi qualcuno può in seguito var newObj = Object.create (foo), e newObj avrà foo come prototipo.
Analizzare l'ereditarietà del prototipo in dettaglio se si desidera ottenere veramente quanto sia utile. Douglas Crockford ne parla in dettaglio nel one dei suoi numerosi discorsi).
L'ambito del primo differisce dal secondo? –
Questo è un bell'articolo http://kangax.github.com/nfe/ –
@amnotiam: concordato. Votato per chiudere. –