在JavaScript中,this是当前执行函数的环境。因为JavaScript有4种不同的函数调用方式:
函数调用: alert('Hello World!')
方法调用: console.log('Hello World!')
构造函数调用: new RegExp('\d')
隐式调用: alert.call(undefined, 'Hello World!')
并且每种方法都定义了自己的上下文,this会表现得跟我们预期的不太一样。同时,strict模式也会影响函数执行时的上下文。
理解this的关键点就是要对函数调用以及它所处的环境有个清晰的观点。这篇文章将会着重于对函数调用的解释、函数调用如何影响this以及展示确定环境时常见的陷阱。
下面列举一些this常用的场景,希望可以对读者有所帮助:
一、普通函数里的this指向:普通函数中的this指针指向于调用者;
this 在函数调用中是一个全局对象,全局对象是由执行的环境决定的。在浏览器里它是window对象。
function fn (){
this.name = '小璇';
console.log(this); // 此处打印window
console.log(this.name); // 此处打印小璇
}
fn();
二、在定时器中的this的指向:
function CreatePerson () {
this.name = '小璇';
setInterval(function(){
console.log(this);
}, 2000) // this指向与构造函数创建的对象:this的调用者是new
// setInterval(this.show, 2000); // 由new来给定时器绑定一个函数
// setInterval(function(){ // this指向于window;因为this是由定时器调起执行的
// console.log(this);
// }, 2000); //把this的指向固定在self变量中
var slef = this;
setInterval(function(){ // 此时,self指向的是对象
self.show();
}, 2000);
}
CreatePerson.prototype.show = function (){
// console.log('hello');
console.log(this);
}
三、在对象方法中的this指针指向:
var name = '小李子';
var per = {
name: '小璇',
fn: function () {
console.log(this.name);
}
}
per.fn(); //this指针指向了per
var obj = per.fn;
window.obj(); // fn方法交给了window对象调用,所以方法中的this指针指向了window对象
四、在构造函数中的调用:
function CreatePerson() {
this.name = '小璇';
// 如果在构造函数中向外返回一个对象,则该对象会覆盖由new创建出来的对象
// return {
// name: '小李子'
// }
// 构造函数不能向外返回引用类型,因为返回的引用类型会替换掉new创建出来的对象
// 如果向外返回的是null对象,则不会替换
return null;
}
// 因为new调用函数执行时:1、开辟一块内存空间;2、把函数中this的指向指为这块空间;3、把创建出来的空间交给变量
var per = new CreatePerson();
console.log(per.name);
五、在事件函数中的this的指向:
function Btn() {
this.b = 23; 这里的this指向调用者new
var _this = this; //凝固指针
document.getElementById('btn').onclick = function (){
// this.show();
_this.show(); //这里的指针依旧是new,而不是点击事件的标签
};
}
window.onload = function () {
new Btn();
}
六、事件函数中this的指向
var btn = document.querySelector('#btn');
btn.onclick = function () {
console.log(this);
// 如果事件函数中嵌套了函数,该函数又出现了this指针,则该指针指向window对象
hello() // 此时下方被调用的hello函数里的this指向window
// hello.call(this); //此时下方被调用的hello函数里this指向点击事件的标签,使用call扭转this的指向到当前作用域的this;
}
function hello() {
this.style.backgroundColor = 'red';
}