关于this的指向


###一个函数中的this关键字的指向——通常情况,如果一个函数所属一个对象,那么这个函数被这个函数所属的对象调用执行,那么这个this就指向这个这个函数所属的对象
###注意:函数中的this指向是在调用时(运行时)决定的,而不是在函数定义的时候决定的。

例1. ``` function test(){ return this; }

test(); //window
window.test(); //window

这是一个函数声明,由于 test 所属于window对象,在我们调用test()的时候实际上调用test的对象是window(全局对象),所以this指向window。
<br><br>
例2.

var obj = {
test:function(){
return this;
}
}

obj.test(); //obj

因为test所属于obj对象,并且由obj对象调用,所以this指向obj。
<br><br>
例3.

var obj = {
a:{
test:function(){
return this;
}
}
}

obj.a.test();

这里的test所属于a对象,并且由a对象调用,所以this指向a。
虽然a属于obj,但 test函数 所属于a对象,而不属于obj对象。
<br><br>
例4.

var test = function(callBack){
callBack();
}

test(function(){
console.log(this); //window
})

这个回调函数里面的this指向window,因为这个匿名函数由参数调用,这个调用者(也就是这个参数)不所属于任何对象,所以默认的指向了window。
<br><br>
例5.

var test = function(){
arguments0;
}

test(function(){
console.log(this); //arguments
})


这个是由arguments对象调用,在传递参数时js自动把传递的匿名函数挂载到了arguments对象下,所以这个匿名函数也是所属于arguments对象的,所以this指向了arguments。
<br/><br/>
例6.

var obj = {str:"1"};
var obj2 = {
test:function(){
return this;
}
}
obj2.test(); //obj2

obj.Fn = obj2.test;
obj.Fn(); //obj

var temp = obj2.test;
temp(); //window
window.temp() //window

由最终调用执行test的对象决定了test内的this的指向。
<br/><br/>
例7.(new关键字)

function test(){



---[[return undefined]]---
}
Test();

如果不使用new关键字调用执行,test里面的this指向调用执行test的对象。
如果不显示的在代码里面使用return,那么这个函数内部会默认的返回undefined。
<br>

function Test(){



---[[return this]]---
}
var A = new Test();

如果使用new关键字调用执行,构造函数里面的this指向创建的实例对象A。
如果不显示的在代码里面使用return返回({},[],RegExp, Date, Function),那么这个构造函数内部会默认返回this(也就是创建的实例对象A)。
<br/><br/>
posted @ 2019-02-18 15:57  江初  阅读(309)  评论(0编辑  收藏  举报