<script> var a = 1; function B(){ var a = 2; setTimeout("C()",1000); setTimeout(C,2000); function C(){ alert("a="+a); } } function C(){ alert("a="+a); } B(); </script>测试一下也就知道了,分别为1和2,因为setTimeout是把后面执行的方法,第一种写法,只会查找全局变量中,是否有A函数,而第二种写法,会优先查找当前作用域中是否有A函数,如果局部没有的话,则顺序查找到全局作用域中。
有一种情况,是说,计时器内部调用的函数的this指向,是指向window的,这里可以说有错,也可以说没错,看一个例子:假设给id=test的一个元素绑定一个click事件。查看其中的this的值。
<script> document.getElementById("test").onclick = function(){ alert(this); //指向触发该事件的元素对象 setTimeout("A()",1000); //这里调用指向window } function A(){ alert(this); } </script>这里就不考虑在IE8-的浏览器了。
按照最初写的两个计时器的例子,在写出如下的代码:
<script> document.getElementById("test").onclick = function() { alert(this); //指向触发该事件的元素对象 setTimeout(A,1000); ////这里依然指向window function A(){ alert(this); } }; function A(){ alert(this); } </script>为什么?不是按理说,这里应该是调用的内部的A方法吗?为什么this却是指向的window?
有一个不确定的想法是:当调用了计时器时,会把当前作用域中的方法,内部的this指向window对象了。而且仅仅是修改了方法内部的this指向,如果有私有变量的取值,依然按照原函数所在的位置,根据作用域,进行取值。
可以这么证明一下:
<script> var a = 1; document.getElementById("test").onclick = function() { alert(this); var a = 123; setTimeout(A,1000); function A(){ alert("a="+a); alert(this); } } function A(){ alert("a="+a); alert(this); } </script>this的指向是和上面一个实例相同的,而alert中的a变量的取值,却是优先获取局部作用域中的值。
当然啦,这里如果把计时器中的调用方法,更换一下,那结果就不相同了哦。
<script> var a = 1; document.getElementById("test").onclick = function() { alert(this); var a = 123; setTimeout("A()",1000); function A(){ alert("a="+a); alert(this); } } function A(){ alert("a="+a); alert(this); } </script>这里,有兴趣的可以试试吧,说到这里,也发现,虽然使用计时器会强制把调用函数的内部的this指向改变成指向window的,但是对于作用域链的影响却只有写法不同带来的影响。即:setTimeout("A()",1000);和setTimeout(A,1000);的不同。当然对于第二种写法,我们可以使用call和apply强行改变A内部this的指向。