this指向

121 阅读1分钟

一、普通函数

非严格模式下

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

严格模式下

'use strict';
function fn(){
    console.log(this);    //undefined
}
fn();

严格模式下this指向undefined,非严格模式下this指向window。

二、定义在对象中时

var obj = {
    name:'zhangsan',
    getName:function(){
        console.log(this);     //obj
        console.log(this.name);   //zhangsan
    }
};
obj.getName();

此时this指向被调用的对象。

var obj = {
    name:'zhangsan',
    getName:function(){
        console.log(this);   //window
        console.log(this.name);   //undefined
    }
};
var f = obj.getName;
f();    

原因:f为全局变量,f()的调用者为window。

三、call、applay

var obj = {
    name:'zhangsan',
    getName:function(){
        console.log(this);    //b
        console.log(this.name);    //lisi
    }
};
var b = {
    name:'lisi'
};
var f = obj.getName.call(b);

call、applay可以修改this指向。

四、箭头函数  this指向定义时函数外部的对象。

function GetThis(){
    this.name = 'lisi';
    setTimeout(()=>{
        console.log(this);         //GetThis
        console.log(this.name);   //'lisi'
    },1000)
}
var a = new GetThis();

如果不使用箭头函数,setTimeout和setIntervel都属于window对象上的方法,this都指向window。

function Person() {
    this.age = 0;
    setTimeout(function() {
        console.log(this);   //window
    },3000);
}
var p = new Person();
function Person1() {
    this.age = 0;
    setTimeout((function(){
        console.log(this);   //person1
    }).bind(this),3000);     //使用bind函数修改this指向
}
var p1 = new Person1();