2011-12-22 186 views
0

我们使用一些JavaScript来覆盖IE的setTimeout方法。这是因为在IE的某些版本中,参数无法正确传递(请参阅here)。全局范围映射的Javascript方法

我必须首先加载修改过的setTimeout脚本,因为如果我在调用setTimeout的代码被解析(未运行)之后加载它,则修改后的版本不会被调用。

当JavaScript引擎解析对全局范围的方法有方法调用的文件时会发生什么?在解析时或执行代码时,是否会创建映射到方法的映射?

编辑

我有几个回答这个问题,这给其他办法解决这一问题,但手头上的问题,不是我的问题,因为我已经有这方面的解决方案。我想通过这个问题获得的是更好地理解javascript如何被解析和运行。

回答

0

编辑#2

小提琴#1 - http://jsfiddle.net/zEaL8/4/ - 允许您设置/重置本地函数。了解重新定义和调用顺序的工作原理。

小提琴#2 - http://jsfiddle.net/aKnjA/1/ - 演示定义顺序无关紧要。请注意,重定义发生在浏览器解析对该函数的调用之后。

编辑

要回答你的问题:JavaScript并没有强制执行的功能定义的任何命令。即我们可以在代码中调用后面定义的函数。当浏览器解析调用后面定义的函数的一行代码时,它不知道在哪里可以找到该函数。在这种情况下,很显然,绑定仅在运行时发生,而不是在初始解析期间发生。这实际上意味着你将重新定义setTimeout。唯一要确保的是,在执行任何调用之前,setTimeout本身的重新定义会被执行。

为了确保新的setTimeout的重新定义,首先处理,你可以将它放在一个脚本块作为外载荷头节点中的第一个元素,domready事件等

即是这样的:

<html> 
<head> 
<script> 
window.setTimeout = function() { 
    alert('new sT'); 
} 
</script> 
</head> 
<body onload="setTimeout();"></body> 
</html> 
+0

是的,但这并没有回答我问的问题,这是关于javascript方法的解析和映射的问题 – 2011-12-23 05:29:46

+0

请看我的更新回答 – techfoobar 2011-12-23 05:46:37

+0

如果你说的是真的,那么我不应该体验到我所看到的行为,即在新的setTimeout方法调用默认方法之前解析的代码,因为它在解析setTimeout方法替换后运行,有什么想法? – 2011-12-23 09:17:58

1

方法在代码执行时创建。

如果代码的语义是正确的解释器能够执行代码。 虽然没有解析没有执行。 解析后的文件是在解析下一个文件之前逐个执行的。

看看这个: 我们有两个js文件。

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

在第二个文件中,我们把setTimeout的声明;

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

在第一个文件,我们会为setTimeout的检查被覆盖

//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 

如果是将分析过程中创建其中我添加的方法。这可以在创建它的脚本的任何地方访问它,甚至可以在声明之前进行访问。 这样:

//somefile.js 
    setTimeout(); // we do not have access to function declared below, so while parsing this wasn't created. 
    window.setTimeout = function() { alert('whatever'); } 
+0

是的,但是这并不回答我问的问题,这是关于javascript方法的解析和映射 – 2011-12-23 05:29:13

0

可以原来的setTimeout存储在代码的开头的全局变量,然后用一个新的函数重载setTimeot。

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

因此,如果这些都是你会超载你的setTimeout函数,并把旧的在oldST的js代码的第一线。

+0

是的,但是这并不回答我问的问题是关于解析和映射javascript方法 – 2011-12-23 05:29:31

+0

映射是在执行代码时创建的,而不是在解析时,这应该是答案。 – khael 2011-12-23 15:52:44