一、普通函数
非严格模式下
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();复制代码