2009-12-03 4 views
6

Jetez un oeil sur le code suivant:Le passage d'un paramètre comme un pointeur en JavaScript

var o; 

(function (p) { 
    p = function() { 
     alert('test'); 
    }; 
})(o); 

o(); // Error: 'o is not a function' 

Dans la fonction ci-dessus, je suis en train de créer une fonction anonyme qui prend un paramètre qui auto-invoque avec précédemment créé objet passé en paramètre. Ensuite, je dirige cet objet vers une fonction (de l'intérieur de la nouvelle portée) et finalement (essayant) de l'invoquer de l'extérieur.

Ma question est, comment puis-je passer cet argument «par référence» pour changer le pointeur vers lequel il pointe?

Répondre

12

Vous pouvez obtenir l'effet que vous voulez en tirant profit du fait que Javascript passe des objets par référence:

var o = { }; 

(function (p) { 
    p.fn = function() { 
     alert('test'); 
    }; 
})(o); 

o.fn(); 
+6

En fait, "passer par référence" est un peu abusif en JavaScript. Par rapport à d'autres langages ayant de vrais types "références", JavaScript ne * passe * rien par référence. Il passe toujours en valeur. Cette valeur peut * contenir * une référence, ce que je pense que vous essayez de dire. –

1

Lorsque vous passez dans la variable o dans votre exemple, vous passez une valeur non définie, non une référence à n'importe quoi. Ce que vous devez faire, c'est envoyer le parent des objets. Dans ce cas, l'objet fenêtre (en supposant que vous utilisez un navigateur).

(function (p, name) { 
    p[name] = function() { 
     alert('test'); 
    }; 
})(window, "o"); 
o(); 

Ceci passe dans l'objet fenêtre et le nom de votre nouvelle fonction. Ensuite, il affecte votre fonction à la fenêtre, et il est maintenant disponible pour être appelé. Sauf si vous allez utiliser des fermetures, cependant, je suggérerais d'assigner la fonction directement.

function o() { 
    alert('test'); 
}; 
o(); 
3

Vous êtes mieux utiliser la langue comme prévu plutôt que d'essayer de se plier pour l'adapter idiomes qui font sens dans une langue construite selon un ensemble de principes différents.

var o = (function(p) { 
    return function() { 
     alert('test'); 
    }; 
})(); 

o(); 
+0

La raison pour laquelle je vais utiliser l'idiome ci-dessus est parce que, avec cela, si je veux changer le nom de l'objet principal ('o'), je dois seulement le changer de la 1ère ligne (' var o; ') et de la partie où je le passe en paramètre ('}) (o);'); Je n'aurai pas besoin de changer quoi que ce soit de la fonction anonyme. –

Questions connexes