2010-08-16 8 views

Répondre

8

Dans le premier exemple, il est la création d'une fonction et exécuter, assigner le résultat à this.foo. Dans le second exemple, il crée la fonction et affecte la fonction elle-même à this.foo.

+0

this.foo dans le second exemple, est équivalent à un pointeur de fonction correct? –

+0

@KennyCason: Vous pouvez le voir de cette façon. C'est assigner la fonction à la variable 'foo' dans le contexte actuel. Cependant, écrire 'function foo() {....}' fera exactement la même chose. –

+2

@james pas tout à fait exactement, 'function foo()' va l'asigner en haut de la portée, 'this.foo = function()' l'affecte juste là – Rixius

-2

Votre premier exemple est tout à fait faux, l'avez-vous réellement essayé? Si vous souhaitez utiliser new et le constructeur Function il fonctionne comme ceci:

foo = new Function("function body"); 

(C'est la pire façon possible de définir une fonction)

Exemple 2 est le chemin à parcourir.

+0

La fonction anonyme dans le premier exemple pourrait retourner une fonction, qui est puis utilisé avec l'opérateur 'new'. Peut-être que la fonction anonyme est une sorte d'usine d'objets? –

+0

En fait, @Ryan ne le fera pas à moins d'envelopper le côté droit de cette expression (c'est-à-dire l'appel de la fonction entière) dans une autre couche de parens. L'opérateur "new" se lie au moins aussi étroitement que(), donc c'est comme '(new (function() {...}))()' tel qu'il est actuellement écrit. – Pointy

+0

'new function() {...}' est bien à faire. Cela ne fait pas la même chose que 'new Function()'. Il fait la même chose que 'new MyConstructor()', ce qui est parfaitement valide. –

3

La principale différence appelle la fonction d'un « nouveau » et en attribuant la fonction anonyme à une variable

ECMA 262 15.3.2: Lorsque la fonction est appelée dans le cadre d'une nouvelle expression, il est constructeur: initialise l'objet nouvellement créé.

Alors this.foo = new (function() {..})(); crée un nouvel objet et l'affecte à this.foo

et

this.foo = function(){...}; définit une fonction anonyme et l'affecte à this.foo

aussi une autre façon est this.foo = (function() {..})(); (sans la « nouvelle ") appelle la fonction et affecte sa valeur de retour à this.foo

Dans votre cas si vous alertez:

var foo = new (function() {})(); 
var bar = function() {}; 
var baz = (function() {return "boo";})(); // without the "new" 

alert(foo); // will alert [object Object], the newly created object 
alert(bar); // will alert function) {}, the function itself 
alert(baz); // will alert "boo", the functions return value