Question

Y at-il un moyen de faire des fonctions et levage variables entre code source présente dans différents fichiers? Autrement dit, quelque chose comme

//Inside firstfile.js
foo === "bar" //should return true

et

//Inside secondfile.js
function bar() {
    this.foo = "bar";
}

Je suppose que cela est impossible, sous forme de fichiers différents comme analysé et exécuté séparément et dans l'ordre par la plupart des moteurs de javascript, mais je ne sais pas pour sûr.

Je ne sais même pas si cela est dans les spécifications de l'ECMA, comme l'analyse syntaxique des différents fichiers ne sont pas vraiment partie de la langue.

Était-ce utile?

La solution

Je pensais à l'origine ce fut une question plus intéressante qu'il n'y paraît en réalité. La réponse à la question que je pensais que c'était que chaque élément de <script> représente une Program séparée, chaque programme distinct est analysé et (cruciale) exécutée avant que quelque chose se passe au programme suivant, par conséquent, les effets de levage ne peuvent être vus dans un programme unique .

Par exemple, dans un seul script:

<script type="text/javasscript">
    alert(typeof foo);
    function foo() {}
</script>

... des alertes « fonction », car la déclaration de fonction est hissée, mais diviser les deux lignes en éléments séparés <script> change ceci:

<script type="text/javasscript">
    alert(typeof foo);
</script>
<script type="text/javasscript">
    function foo() {}
</script>

... des alertes "undefined", parce que le premier script est exécuté avant que le second script est même analysé.

Autres conseils

sources Javascript séparément chargées peuvent influer sur le contexte mondial. Ainsi,

window.foo = "bar";

dans un fichier source permettra à une autre source (chargé par la suite) pour vérifier:

if (window.foo === "bar") {
  // do something
}

doit travailler, ou bien il ne serait pas possible de créer quelque chose comme tous les cadres populaires Javascript.

Le « ce » mot-clé n'a de sens que dans une fonction, et sa valeur n'a rien à voir avec le fichier source à partir de laquelle la fonction est venue (au moins, rien dans un sens direct).

modifier - Je suppose que la chose intéressante est ici le comportement de l'interpréteur Javascript que (pour utiliser le terme dans la question) fonction « monte-charge » déclarations haut avant tout autre code dans un bloc en cours d'évaluation. Cela aussi se fait sur une base de script par script lorsque le navigateur est de les charger. Ainsi, les déclarations de fonctions dans un bloc de script sont interprétées avant tout autre code dans chaque bloc , mais une seule étiquette <script> sera complètement évaluée avant la balise suivante <script> est chargé et évalué.

Les choses se compliquent si vous utilisez quelque chose comme LabJS ou enhance.js à des scripts de charge, mais je ne sais pas de tout contexte dans lequel vous pouvez compter sur des scripts « mélangeant ensemble » en quelque sorte à moins que vous les combinez explicitement sur le serveur.

Toutes les balises de script qui rencontre du navigateur sont analysées et exécutées immédiatement. Ceci est dû à l'API document.write, qui pourrait nécessiter au navigateur à quelque chose de sortie vers le DOM. Cela signifie que dans cette situation # script1 doit de terminer avant # SCRIPT2.

<script id="script1"></script>
<script id="script2"></script>

Vous pouvez vérifier ce que le comportement lors de l'utilisation des attributs ASYNC et DEFER. Ils sont pris en charge dans WebKit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top