JS this指向

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();    //看清楚这里有没有括号,有表示执行方法;无表示方法的定义
posted @ 2020-01-10 16:39  haozj  阅读(120)  评论(0编辑  收藏  举报