Nous utilisons un peu de javascript qui écrase la méthode setTimeout pour IE. En effet, dans certaines versions d'IE, les paramètres ne sont pas transmis correctement (voir ici).

Je dois d'abord charger le script setTimeout modifié, car si je le charge après que le code qui appelle setTimeout est analysé (pas exécuté), la version modifiée n'est pas appelée.

Que se passe-t-il lorsque le moteur javascript analyse les fichiers qui ont des appels de méthode aux méthodes de portée globale? Les mappages aux méthodes sont-ils créés au moment de l'analyse ou lorsque le code est exécuté?

MODIFIER

J'ai eu quelques réponses à cette question, qui donnent d'autres solutions à ce problème, mais le problème n'est pas ma préoccupation car j'ai déjà une solution. Ce que je veux gagner par cette question, c'est une meilleure compréhension de la façon dont javascript est analysé et exécuté.

0
Aran Mulholland 22 déc. 2011 à 11:23

3 réponses

Meilleure réponse

MODIFIER # 2

Violon # 1 - http://jsfiddle.net/zEaL8/4/ - Vous permet de définir / réinitialiser une fonction native. Pour voir comment fonctionne la redéfinition et l'ordre d'appel.

Violon # 2 - http://jsfiddle.net/aKnjA/1/ -Démontre que l'ordre des la définition n'a pas d'importance. Notez que la redéfinition se produit après que le navigateur a analysé l'appel à la fonction.

MODIFIER

Pour répondre à votre question: Javascript n'applique aucun ordre de définition des fonctions. c'est-à-dire que nous pouvons appeler une fonction définie ensuite dans le code. Lorsque le navigateur analyse une ligne de code qui appelle une fonction qui est définie par la suite, il n'a aucune idée de l'endroit où trouver cette fonction. Cela étant, il est clair que la liaison ne se produit qu'au moment de l'exécution et non pendant l'analyse initiale. Cela signifierait en fait que votre redéfinition de setTimeout est ce qui va s'exécuter. La seule chose à garantir est que la redéfinition de setTimeout elle-même soit exécutée avant tout appel à celle-ci.

Pour vous assurer que la redéfinition de votre nouveau setTimeout est traitée en premier, vous pouvez le placer dans un bloc de script comme premier élément à l'intérieur du nœud principal hors charge, domReady etc.

C'est-à-dire quelque chose comme:

<html>
<head>
<script>
window.setTimeout = function() {
    alert('new sT');
}
</script>
</head>
<body onload="setTimeout();"></body>
</html>
0
techfoobar 23 déc. 2011 à 09:42

Les méthodes sont créées au moment de l'exécution du code.

Si la sémantique du code est correcte, l'interpréteur est capable d'exécuter du code. Pendant l'analyse, rien n'a été exécuté. Le fichier après l'analyse est exécuté individuellement un par un, avant d'analyser le suivant.

Vérifiez ceci: nous avons deux fichiers js.

<script src ='1.js'></script>  
<script src ='2.js'></script>

Dans le deuxième fichier, nous mettons la déclaration de setTimeout;

 //file2
 window.setTimeout = function(){};

Dans le premier fichier, nous vérifierons que setTimeout est remplacé

//file1
var f = function() { alert( setTimeout );  };
f();// alerts native setTimeout

 setTimeout( f, 1000 ); // We use native settimeout, propably after one second file2 being loaded and executed and function `f` will be alerts the overriden setTimeout

Si des méthodes que j'ai ajoutées étaient créées lors de l'analyse. Cela lui serait accessible n'importe où dans le script dans lequel il a été créé, avant même sa déclaration. donc:

//somefile.js
  setTimeout(); // we do not have access to function declared below, so while parsing  this wasn't created.
  window.setTimeout = function() { alert( 'whatever' ); }
1
abuduba 23 déc. 2011 à 09:28

Vous pouvez stocker setTimeout d'origine dans une variable globale au début du code, puis surcharger setTimeot avec une nouvelle fonction.

 window.oldST = setTimeout;
 window.setTimeout = function(funct,x) {
    return oldST(funct,x);
 }

Donc si ce sont les premières lignes du code js, vous aurez surchargé la fonction setTimeout avec la vôtre et défini l'ancienne dans oldST.

0
khael 22 déc. 2011 à 07:46