this理解
this指的是当前调用的对象,是在JS运行时确定。无论何时,要想获取this指向谁,就要知道运行时谁在调用这个方法或者变量。
常见的情况
1.全局变量会被挂载到window上作为属性。
function test(){ console.log(this.a) } var a = 5; test(); //这里实际是window.test(),test作为window的属性,a也是一样。
2.作为对象属性,由对象调用
function test(){ console.log(this.a) } var a = 5; var obj = { a:3; test:test } obj.test();
3.把函数赋值给全局变量
function test(){ console.log(this.a) } var a = 5; var obj = { a:3; test:test } let t = obj.test; t(); //5
注意:这里是将对象的test属性赋值给t,而test属性就是test方法,所以t相当于test这个方法。
4.对象属性内调用方法
function test(){ console.log(this.a) } var a = 5; var obj = { a:3; test:function(){ test(); } } obj.test(); //5,虽然test在obj内,但是调用test方法并未使用obj对象
function test(){ console.log(this.a) } var a = 5; var obj = { a:3; test:function(){ console.log(this.a) //this是obj对象 } } obj.test(); //3
function test(){ console.log(this.a) } var a = 5; var obj = { a:3; test:function(){ console.log(this.a) //3 (function(){ console.log(this.a) //5,this依然是window this.a+=1; console.log(this.a) //4 })() } } obj.test();
5.多级调用
function test(){ console.log(this.a) } var a = 5; var obj = { a:3; b:{ test:function(){ console.log(this.a) //undefined } } } obj.b.test(); //看清楚这里有没有括号,有表示执行方法;无表示方法的定义
由于最后调用test()是b所以寻找b内的a,不存在就是未定义。
在b内定义a时
function test(){ console.log(this.a) } var a = 5; var obj = { a:3; b:{ a:9, test:function(){ console.log(this.a) //9 } } } obj.b.test(); //看清楚这里有没有括号,有表示执行方法;无表示方法的定义