2008-12-17 4 views
1

Comme le dit le titre, ce qui est la différence entreQuelle est la différence entre ces deux types de fonction syntaxe

MyFunction = function() { 

} 

et

function MyFunction() { 

} 

Rien?

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

+0

Si vous fermez en disant doublon, pouvez-vous s'il vous plaît commenter avec un lien vers ce que c'est une copie de? – singpolyma

+0

Je préfère les ajouter à la question - ils sont plus faciles à trouver, je pense que – Greg

+0

@RoBorg assez juste.Quand j'ai regardé ce n'était pas n'importe où était :) – singpolyma

Répondre

1

La première forme est en fait une variable avec une fonction anonyme qui lui est attribué, le second est une fonction déclarée .

Ils sont presque interchangeables, mais ont quelques différences: débogueurs ont plus de mal avec Anon (parce qu'ils ne disposent pas d'un nom) et le moteur JS peuvent accéder directement à des fonctions déclarées partout où elles existent dans le script, mais Anon le peuvent ne seront pas accessibles avant d'avoir été assignés.

0

Je pense que vous voulez dire

var MyFunction = function() { 
} 

Et dans de nombreux cas, il y a peu de différence. La syntaxe var est parfois utile lorsque vous êtes dans une sorte de classe d'enveloppement et que vous voulez être sûr de votre espace de noms (comme dans greasemonkey).

Aussi, je crois que les trucs de constructeurs de fonctions (avec .prototype, etc.) ne fonctionnent pas avec la syntaxe var.

0

ici est une différence:

function Moose() { 
    alert(arguments.callee.name); // "Moose" 
} 
var Cow = function() { 
    alert(arguments.callee.name); // "" 
} 
-1

Il y a une différence subtile sur Firefox, lorsque vous déclarer un gestionnaire d'événements fenêtre load. Déclarant ce qui suit dans une balise de script ne fonctionne que sur Firefox:

function onload() { 
    alert(42); 
} 

Vous devez le faire comme ça pour IE, Opera, Safari ou Chrome:

onload = function() { 
    alert(42); 
} 
+0

n'est-ce pas un problème différent? Onload n'est pas un local - c'est un membre de la fenêtre. votre code dit vraiment "window.onload = function() {blah}, ce qui est une autre idée – Jimmy

+0

la première fonctionnera car il y a effectivement une implicite avec (window) donc elle est assignée à window.onload, et serait juste comme cassé comme la deuxième forme s'il a été déclaré "var onload ..." - ceci est une implémentation absolument horrible de la liaison d'événement onload bien que – annakata

+0

@Jimmy: Qu'il s'agisse d'un "problème" différent ou non, cela répond à la question de savoir s'il n'y a "absolument aucune différence" entre les deux types de déclaration Il semble qu'il y ait un scénario étrange qu'il y ait –

0

function myFunction(){} est le même que var myFunction = function myFunction(){}. Si vous faites simplement MyFunction = function(){}, c'est comme MyFunction = function anonymous(){}.

Les variables et les fonctions ont des portées différentes mais la fonction ne peut être référencée qu'en dehors de la fonction via le nom de variable, qui doit être lié à la fonction.

function myFunction(){} lie la variable myFunction à une fonction qui se passe juste pour avoir le même nom.

+0

On le penserait, mais il y a une différence très subtile. Comme un exemple très simple (en raison de la limite de caractères) var foo = function() {alert (foo)}; f = foo; foo = 5; f() // alertes '5' var foo = fonction foo() {alert (foo);} f = foo; foo = 5; f() // alertes avec notre fonction – olliej

+0

Et je serais bon pour votre cas: le propre nom d'une fonction est dans sa propre portée, alors que le "foo" externe est dans une portée externe. –

Questions connexes