2009-02-04 10 views
4

J'essaie de comprendre un script généré par Asp.Net Ajax Toolkit, qui donne actuellement un "objet attendu" (l'erreur disparaît si je place mon PopupControlExtender dans un panneau de mise à jour).Que signifie cette syntaxe javascript?

document.getElementById('ctl00_ValidationSummary1').dispose = function() { 
    Array.remove(Page_ValidationSummaries, document.getElementById('ctl00_ValidationSummary1')); 
} 
(function() {var fn = function() {AjaxControlToolkit.ModalPopupBehavior.invokeViaServer('ctl00_c1_componentCategoryListUC_componentCategoryGrid_modalPopupExtender', true); Sys.Application.remove_load(fn);};Sys.Application.add_load(fn);})(); 

Ce que je vois ici est:

someobject.someevent = function() { 
    dosth; 
} /* Get ready, I am about to do sth crazy ... */ 
(function() { dosth; })(); /* you did what? */ 

Qu'est-ce que cette syntaxe signifie?

Édition: Je suis particulièrement curieux de savoir (fonction() {...})() venant immédiatement après la fin d'une autre fonction}.

Édition: Il s'avère que les utilisateurs ajax ont oublié de placer un point-virgule après l'affectation du gestionnaire d'événements.

Répondre

5

La syntaxe

(function() { dosth; })();

déclare une fonction anonyme, et exécute alors immédiatement. Cela équivaut à faire ceci:

var myFun = (function() { dosth; }); 
myFun();

mais sans la variable temporaire.

D'une manière générale, cela revient à exécuter simplement ce que dosth est; mais la création d'un objet fonction introduit une nouvelle portée pour les variables (en raison de la fermeture), ce qui est souvent utilisé pour contourner les problèmes de portée.

Dans le cas spécifique que vous avez cité, je ne vois pas pourquoi cela serait particulièrement nécessaire.Cependant, il pourrait être fait comme ceci pour deux raisons - soit le Javascript final lui-même est généré par un processus automatique qui ne peut pas dire si la fermeture est nécessaire; ou il a été écrit par un humain qui a décidé de toujours envelopper les choses dans des fonctions pour être en sécurité.

1
(function() { dosth; })(); 

enveloppements dosth dans une fonction anonyme puis exécute cette fonction anonyme dès que la page se charge (c'est ce que les final() 's font)

+0

En fait, il fonctionne immédiatement. Cela pourrait être avant le chargement de la page – meouw

0

En supposant que vous dire ceci:

(function() { dosth; })(); /* you did what? */ 

Ceci déclare une fonction anonyme dans le premier bloc parens qui sera un objet retourné à partir de ce bloc paren exécuté par le second bloc parent. Donc, cela définit et exécute tout ce que "dosth" est.

2
(function() { dosth; })(); 

Ici, une fonction anonyme est créée, puis immédiatement appelée.

Il s'agit d'un idiome relativement populaire pour créer une portée locale en JavaScript, où seules les fonctions ont leur propre portée. Une portée locale vous permet d'avoir des variables privées et évite les conflits de noms.

Dans d'autres langues vous pourriez écrire quelque chose comme

int a = 1; 
{ 
    int b = 0; 
    if (something){ 
     int c = 3; 
    } 
} 

et les trois variables seraient tous dans des étendues séparées, mais en JavaScript vous devez déclarer une fonction pour obtenir un nouveau champ d'application.