2010-01-11 1 views
2

j'ai écrit un script comme ça:Pourquoi ma fonction JavaScript n'est-elle pas capable d'accéder aux fonctions/variables de portée globale définies dans mes autres fichiers .js?

NS.load = function(src) { 
    var script = document.createElement("script").setAttribute("src", src); 
    document.getElementsByTagName("head")[0].appendChild(script); 
} 

Il charge les fichiers mais je ne peux pas accéder à des fonctions et des variables defiened dans d'autres fichiers.

//js/main.js 
var qux = {name: "name"}; 
NS.load("js/foo.js"); 

//js/foo.js 
alert(qux.name); //undefined variable 

Mais si je définis qux comme ceci:

window.qux = {name: "name"}; 

je peux atteindre qux variable dans d'autres modules. Pour autant que je sache, tous les globals sont déjà membres de l'objet window. Alors pourquoi je dois définir des variables comme celle-ci. Pourriez-vous proposer une autre méthode?

Merci.

Répondre

7

On dirait que vous avez essayé de le raccourci de votre code en appelant createElement et setAttribute tout sur 1 ligne, mais setAttribute ne retourne rien, vous ne pouvez pas aller appeler appendChild sur sa valeur de retour, car il y a none.This fixerai:

NS.load = function(src) { 
    var script = document.createElement("script"); 
    script.setAttribute("src", src) 
    document.getElementsByTagName("head")[0].appendChild(script); 
} 

Edit:

Quel genre d'environnement vous exécutez votre code? Quelque chose se passe-t-il entre sites ou définissez-vous qux à l'intérieur d'une autre fonction? Les travaux suivants pour moi, exécutant les fichiers via http://localhost/test.html

<html> 
<head> 
    <script type="text/javascript"> 
     load = function(src) { 
      var script = document.createElement("script"); 
      script.setAttribute("src", src); 
      document.getElementsByTagName("head")[0].appendChild(script); 
     } 
     var qux = {name: "name"}; 
     load("foo.js"); 
    </script> 
</head> 
<body></body> 
</html> 

foo.js:

alert(qux.name); 

je reçois une alerte avec "nom" lorsque la page se charge.

+0

Merci Langdon. Le code original est identique au vôtre. Je l'ai coupé pour la brièveté. Mais je ne connaissais pas la valeur de retour de setAttribute(). C'est bon d'apprendre ça. – jsonx

+0

jsonx, vérifiez mon édition. – Langdon

+0

Votre code fonctionne. "Quel genre d'environnement utilisez-vous votre code?" C'est la question et la réponse. Maintenant j'ai compris. En fait mon code loader est dans la méthode ready de jQuery, ainsi je dois lier des variables à l'objet window pour atteindre d'autres modules. Merci Langdon. – jsonx

Questions connexes