首页 > 建站教程 > JS、jQ、TS >  javaScript定时器中的this指向问题正文

javaScript定时器中的this指向问题

    看例子:代码中的两个setTimeout执行后的结果分别是什么?
<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的指向。