开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第41天,点击查看活动详情
前言
很多人在开发的时候都会遇到 this 关键字,它基本就是指向当前的对象。以下主要是记录对this学习的笔记记录。
this
this 是用来表示一个上下文对象,用于“传递” 一个对象的引用。观察以下例子,可以发现 add函数需要传递对象当作参数,而addNo函数仅需绑定对象,然后通过使用this就可以访问到对象内的属性。add函数这种显示传递上下文对象在复杂的模式中,也会导致混乱,反而使用this则不会这样。
function add(context) {
console.log(context.numA + context.numB);
}
function addNo(){
console.log(this.numA+this.numB)
}
var obj = {
numA: 1,
numB: 3
}
add(obj); // 4
addNo.call(obj); // 4
this的误解
但是有时候使用 this 时还是会经常错误,本来以为是指向的是函数本身但是结果不是,指向当前的对象?也可能不是,查看以下2种误区:
- 1、错误1:指向自身this是否是指向函数本身呢? 首先看下以下例子,看看是不是你理解的结果:
function foo(i) {
console.log(`当前是:${i}`)
this.count++;
};
foo.count = 0;
(function main() {
for (let index = 0; index < 5; index++) {
foo(index);
}
})();
console.log(`count的值:${foo.count}`);
//运行得到的结果
当前是:0
当前是:1
当前是:2
当前是:3
当前是:4
count的值:0
Count的值是0,而不是5,因为执行道foo.count时是给函数对象foo增加了count属性,但是在for循环中执行foo(index),所指向的函数对象foo不是同一个;那怎么样才能让其指向同一个呢?常用的方法有:
- 方法1:this.count++修改成foo.count++ 让其显示替代this来引用函数对象
- 方法2:foo(index)修改成foo.call(foo,index) ,通过绑定方式,强制让this指向函数对象foo
- 2、错误2:this指向函数的作用域
this在任何情况下都不指向函数的词法作用域,那么 this到底应该是指向谁?This在运行时才进行绑定,所以在定义时this对指向谁是未知的,只有在运行时才能确认指向谁,且实际上this最终指向的是那个调用它的对象。
判断this,可以根据优先级来判断:
- new 中调用则绑定的是新创建的对象
- 使用 call、apply 调用是指向指定对象
- 如果在某上下文对象中调用则指向上下文对象
- 若不是以上三种情况则可能绑定到undefined或全局对象