2009-08-28 7 views
3

Lorsque je crée un espace de noms JS (monNamespace) avec une méthode publique (myPublicMethod)Comment appeler une fonction publique dans un namesapce Javascript

jsfile1.js

var myNamespace=(function() { 

    var myPublicMethod=function(){ 
    alert("hello world"); 
    } 

    return 
    { 
    myPublicMethod:myPublicMethod 
    }; 

})(); 

et ont un .js séparés fichier qui encapsule ses méthodes

jsfile2.js

(function(){ 
    myNamespace.myPublicMethod(); 
})(); 

Les deux fichiers sont e en inclus dans un fichier html

<script src="jsfile1.js"...> 
<script src="jsfile2.js" ...> 

Quand je tente d'appeler myPublicMethod() Je reçois une erreur qui ne monNamespace existe pas. Est-ce parce qu'il est encapsulé dans le fichier jsfile2.js?

Remerciements

+0

Vous avez manqué le changement le plus important ... J'ai révisé jimr de répondre pour le signaler explicitement. – Shog9

Répondre

7

La raison pour laquelle la fonction n'est pas définie dans votre espace de noms est à cause des lignes

return 
{ 
    myPublicMethod:myPublicMethod 
} 

Un point-virgule implicite est inséré après le retour, donc ce que l'interprète voit est en fait quelque chose comme:

donc rien est en fait revenu de la fonction, et la valeur de myNamespace reste undefined. La solution est simple: il suffit de mettre l'accolade d'ouverture sur la même ligne que le return:

return { 
    myPublicMethod: myPublicMethod 
}; 

(notez que le point-virgule final est pas strictement nécessaire, mais une bonne idée de toute façon si vous prévoyez jamais utilisez quelque chose comme un minifier)

Aussi, la façon dont vous définissez la fonction dans le premier fichier is invalid. Il devrait être

var myNamespace = (function() { 
... 
})(); 
+0

Révisé en fonction de votre exemple, les changements ci-dessus, et toujours obtenir la même erreur. – ChrisP

+0

Déplacement du {à la même ligne que le retour travaillé. Intéressant que vous devez mettre l'accolade ouvrante sur la même ligne que le "retour". Cela semble incompatible avec le fonctionnement d'autres aspects de la langue. Merci. – ChrisP

1

La modification du fichier 1 pour le travail suivant?

var myNamespace={ 

    myPublicMethod: function(){ 
    alert("hello world"); 
    } 
}; 
1

Vous avez entre parenthèses manquant sur votre déclaration de fonction myNamespace, vous devriez également utiliser des points-virgules dans votre déclaration de retour:

var myNamespace = function() { 

    var myPublicMethod = function(){ 
    alert("hello world"); 
    } 

    return { 
    myPublicMethod : myPublicMethod 
    }; 
}(); 

myNamespace.myPublicMethod(); 
+0

Mêmes modifications que la réponse 1, mais toujours une erreur. – ChrisP

Questions connexes