首先我们应该明白js中的this是在代码运行期进行绑定的,这也是js中的this具备多重含义的原因。
window中的方法就是全局函数,
window中的属性就是全局变量。
在es6之前,this的指向取决于函数的调用方式,有以下几种调用方式:
1.函数调用
2.方法调用
3.构造函数的调用
4.上下文的调用方式
//函数调用方式
<script>
//eg1:
var obj={
a:23,
say:function(){
console.log(this.a);
}
}
var egObj=obj.say;
var a=10;//这是(window)全局变量a;
egObj();//等价于window.egObj();this指向window,结果为10
//eg2:
function fn(){
var b=20;
console.log(this.b);
}
var b=3;
fn();//等价于window.fn();this指向全局(window),结果为3
</script>
2.方法调用方式
<script>
var obj={
a:23,
say:function(){
console.log(this.a);
}
}
obj.say();//此时this指向obj(调用该方法的对象),结果为23
//eg2:
var obj2={
a:0,
b:0,
say:function(a,b){
var sayA=function(a,b){
//console.log(this);//this指向window
this.a=a+b;
console.log('sayA函数的结果:'+this.a)
}
sayA(a,b);//此处为函数调用方式,故this指向为window
console.log('say函数的打印结果:'+this.a);
}
}
obj2.say(2,3);//给函数传入的实参就相当于var a=2,b=3;
</script>
3.构造函数的调用方式
<script type="text/javascript">
function Fn(){
return new Fn.prototype._init();
}
Fn.prototype={
constructor:Fn,
length:12,
_init:function(){
console.log(this.length);
}
}
Fn();//结果为undefined
//因为_init以构造函数的形式调用,其内部的this指向_init构造函数的实例
//this只能访问函数本身的属性及实例的原型中的属性
//首先查找函数本身,若没有,查找实例的原型对象(在实例对象的原型链中依次查找),一直找到根对象。
//显然 _init()函数内部没有length,实例的原型对象中也没有。
var obj={
a:0,
say:function(){
//this.a=4;//给函数say中设置一个属性a
console.log(this.a);
}
}
var a=1;
new obj.say();//值为undefined,若say中设置a属性,则值为4;
obj.say.prototype.a=3;
new obj.say();//值为3,因为say()构造函数的原型中有a属性,若say中设置a属性,则值为4;
</script>
4.上下文的调用方式
call/applay/bind方法,切换函数执行的上下文环境,就是改变this的指向
<script type="text/javascript">
var obj={
a:0,
b:3,
say:function(){
// setTimeout(function(){
// console.log(this.a);//此时为undefined;
// //因为setTimeout()中的匿名函数的this指向window对象,所以为undefined
// //现在想使用obj中的a属性
// //解决如下
//
// },100);
setTimeout((function(){
console.log(this.a);
}).bind(obj),100);//或者将obj改为this,结果为0
//函数名.bind()只是实现了this的绑定,产生了一个新函数,并没有执行
//或者使用自调函数直接执行
(function(){
console.log(this.a);
}).bind(this)();//值也为0
}
}
obj.say();
</script>
call方法的 第一个参数:
1.若为复杂类型数据,如对象数组,则为指向的对象。
2.若为null/Undefined,this指向window;
3.若为数字,this指向Number构造函数的实例,如Number{数字}
4.若为字符串,this指向String构造函数的实例
5.若为布尔值,this指向Boolean构造函数的实例