JS中的this指向问题

一、全局作用域中

var name="xiawang",age=16;
var obj={
name:"xiaozhang",
obage:this.age,//this指向window

fun:function(){
console.log(this.name+"的年龄"+this.age+"l")//this指向obj
}
}

console.log(obj.obage);//16
console.log(obj.fun())//xiaozhang的年龄undefined(obj中未定义这个属性)

二:闭包中指window

var name='The Window';
var obj={
name:'my obj',
get:function(){
//这里的this指的是对象,这里为obj
var self=this
return function(){
//闭包里的this指的是window
return this.name;//return self.name--my obj
}
}
}

alert(obj.get()()) //window

三:函数调用模式:谁调用就指谁

这里obj.fn()是obj去调用fn,而obj.name=”b”,所以this.name=”b”;
而var fn=obj.fn的时候,fn是window.fn,因此fn()的结果是”a”.
注意:this指向的是上一级(最近一集)调用它的对象,比如obj.fn()与window.obj.fn()都是输出b.

四:构造函数中,this指实例对象。

 

五:apply/call改变this的指向

一般来说,this总是指向调用某个方法的对象,但是使用call()和apply()方法时,就会改变this的指向。

参考博客:https://blog.csdn.net/ganyingxie123456/article/details/70855586

 

六:定时函数中:this指向window

1、最常用的方法:在外部函数中将this存为一个变量,回调函数中使用该变量,而不是直接使用this。

var name = 'my name is window';

 var obj = {
 name: 'my name is obj',
 fn: function () {
 var that = this;
 var timer = null;
 clearInterval(timer);
 timer = setInterval(function () {
 console.log(that.name); //my name is obj
 }, 1000)
 }

在fn中加了var that = this; 回调函数中使用that代替this即可。这种方法最常见,使用也最广泛

七:bind改变this指向

https://www.cnblogs.com/443855539-wind/p/6480673.html

 

 

八:ES6箭头函数:函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。箭头函数的最大作用就是this指向

箭头函数没有自己的this,它的this继承自外部函数的作用域。所以,在该例中,定时器回调函数中的this,是继承了fn的this。当然箭头函数也有兼容问题,要是兼容低版本ie,需要使用babel编译,并且引入es5-shim.js才可以。

 

posted @ 2018-11-08 14:09  小炸渣i  阅读(70)  评论(0)    收藏  举报