web-dev-qa-db-fra.com

importScripts (travailleurs Web)

J'ai essayé d'utiliser importScripts pour charger un deuxième fichier JavaScript dans mon travailleur Web, mais bien qu'aucune erreur ne se soit produite, cela n'a pas fonctionné. J'ai réduit le problème à cette situation très simple:

Dans le fichier HTML principal:

<script>
var w = new Worker("script1.js");
w.addEventListener("message", function(e){
    alert(e.data);
})
w.postMessage();
</script>

Dans script1.js:

self.addEventListener("message", function(e){
    var a = 5;
    importScripts("script2.js");
    self.postMessage(a);
})

Dans script2.js:

a = 6

Je voudrais voir une boîte de dialogue affichant 6, car a est passé de 5 à 6 en important script2.js, mais la boîte de dialogue affiche 5. Que me manque-t-il ici?

28
Vincent

En utilisant var a dans la fonction signifie que a sera toujours privé. Depuis importScripts ajoute à la portée globale , JS préfère accéder au a le plus localisé dans la fonction qui publie a. Vous pouvez publier self.a à la place, qui sera 6, comme vous vous y attendiez.

EDIT: Quelqu'un m'a récemment posé des questions à ce sujet en personne, j'ai donc fait une démo pour clarifier le comportement: http://pagedemos.com/importscript/

38
dandavis