Perché la funzione sopra incapsulata tra parentesi e perché c'è un ();
alla fine?Spiega la seguente dichiarazione JavaScript?
Penso che sia una funzione di costruzione a causa dello ();
alla fine, ma perché l'oggetto è racchiuso tra parentesi?
Perché la funzione sopra incapsulata tra parentesi e perché c'è un ();
alla fine?Spiega la seguente dichiarazione JavaScript?
Penso che sia una funzione di costruzione a causa dello ();
alla fine, ma perché l'oggetto è racchiuso tra parentesi?
Questo codice è equivalente a:
function Ninja() {
// nothing here
}
var ninja = new Ninja();
Anche se nel codice che hai elencato, la funzione/oggetto Ninja non è un ambito globale.
Il codice (function() {...})();
in pratica dice "prendi qualsiasi funzione sia contenuta qui e eseguila immediatamente". Quindi sta creando una funzione anonima e la chiama subito dopo.
Perché la dichiarazione di funzione incapsulato in '(' s ed anche per questo è c'è un '();'. Alla fine
La sua dichiarazione e l'esecuzione della funzione allo stesso tempo
si può vedere: Named function expressions demystified - by Juriy "kangax" Zaytsev
Si chiama Immediately-Invoked Function Expression (o IIFE). Crea un nuovo ambito ed esegue immediatamente il contenuto. Ci sono molti usi per questo; quello che uso di più è quando la parola chiave this
cambierà significato, ad es. in
var someClass = function() {
this.property = something;
this.update = (function(obj) {
function() {
$('.el').each(function() {
$(this).html(obj.property);
});
};
)(this);
};
Mentre voglio consultare this.property
all'interno delle $('.el').each()
, this
significato cambia in tale ambito e si riferisce all'elemento DOM corrente che viene collegato in cascata con .each()
. Quindi, passando this
come parametro nell'IFE (e chiamando il parametro obj
), è possibile utilizzare obj.property
per fare riferimento a ciò che è this.property
quando non rientra nell'ambito di $('.el').each(..., function() { ... });
.
fatemi sapere se questo ha un senso o se avete domande :)
Come suggerito: Facendo riferimento alla Benalman
Immediatamente-Invocato espressione di una funzione (IIFE) Fortunatamente, il “fix” SyntaxError è semplice. Il modo più largamente accettato per dire al parser di aspettarsi un'espressione di funzione è solo racchiudere tra parentesi, perché in JavaScript, il paren non può contenere istruzioni. A questo punto, quando il parser incontra la parola chiave function, è in grado di analizzarlo come espressione di funzione e non come dichiarazione di funzione.
// È possibile utilizzare uno dei seguenti due motivi per richiamare immediatamente // un'espressione di funzione, utilizzando il contesto di esecuzione della funzione su // creare "privacy."
(function() {/ * codice * /}()); // Crockford raccomanda questo
(function() {/ * codice * /})(); // Ma questo funziona altrettanto bene
Vorrei suggerire di leggere, http://benalman.com/news/2010/11/immediately-invoked-function-expression/ –
Vedi anche: [Come funziona una funzione anonima in JavaScript lavoro?] (http://stackoverflow.com/questions/1140089/how-does-an-anonymous-function-in-javascript-work). –
@KevinDeVoe il tuo duplicato è migliore – Dave