总结:
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所以要单独列出来。