javascript---总结this指针

总结:

this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window而当函数被作为某个对象的方法调用时, this等于那个对象。


1.函数中的this

1 //普通函数
2 function show(){
3     alert(this);
4 }
5 show();            //window

解答:此处由于函数show是在window环境下执行的,所以this自然指向了window。

//函数表达式
var arr=[1,2,3];
arr.show=function(){
    alert(this);
}
arr.show();                //1,2,3

解答:此处由于show函数是arr对象下调用的,所以this自然指向了arr对象。总之,this对象是多变的,指向执行时的环境。

 

//函数引用
var obj={
    name:'a Object',
    f:function(){
        alert(this.name);
    }
}
obj.obj1={
    name:'another Object',
    me:obj.f,
}
obj.obj1.me();                //指向obj1

和下面对比:

//引用函数是可以改变函数的执行作用域的,但是像之前的,调用函数是不会改变函数的执行作用域的
var obj={
    name:'a Object',
    f:function(){
        alert(this.name);
    }
}
obj.obj1={
    name:'another Object',
    me:obj.f(),
}
obj.obj1.me;                //指向obj

解答:上面两个十分相似,但是结果却大有不同,第一个,执行me函数时候,是obj1调用的,所以指向obj1,可能你有疑问:obj.f不是obj调用吗?切记,this指向执行时函数被调用的对象,是obj1调用me函数,所以指向obj1。而第二个,me这个属性已经是一个执行函数f,obj.f(),所以指向obj。

 


 

2.闭包中的this

//闭包
function show(){
    function text(){
        alert(this);
    }
    text();
}
show();                    //window

其实,闭包中的this是指向window的。这也顺应了闭包的优缺点:就是变量会驻留在内存中,是福也是祸啊!!

补充:

• 定时器(setTimeout,setInterval)和匿名函数中的this也同样是指向window的。

 


 

3.构造函数的this

   ″其实new的作用就是使this指向一个新建的对象,然后return this。″

也就是说:构造函数new之后都是指向新建的对象。

 


 

4.call和apply中的this

 

var test="Tony";  
function doSomething(){  
    alert(this.test);     //弹出 "Tony";  
}  
  
doSomething(); //   [调用]  doSomething();  
doSomething.call(); // 函数.调用()  

对比下面:

 

var test="Tony";  
var myobj={  
    test : "Tom"  
};  
function doSomething(){  
    alert(this.test);     
}  
doSomething.call(); // 弹出 window.test   ,即 "Tony"  
doSomething.call(myobj); // 这个时候,doSomething函数里的this指向 myobj,  
                          //所以弹出的是 myobj.test 即 "Tom"  

解答:其实注释也很明白,只要记住,如果call或者apply传的第一个参数是哪个对象this就指向哪个对象,如果不传参则默认window。

 


 

5.eval()中的this

 • 直接调用eval()的话,this指向当前作用域的。('use strict'不用也是一样的),不直接调用则指向window

var x='global';
function trueEval(){
    var x='local';
    alert(eval('x'));                //local
}
trueEval();

解答:可能看到这觉得,不应该是this指向调用函数的对象吗,应该是window啊,不过这是特例,eval所以要单独列出来。

 


 

posted @ 2016-03-17 23:38  GacentJohn  阅读(120)  评论(0编辑  收藏  举报