js篇 this关键字

77 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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. 方法1:this.count++修改成foo.count++ 让其显示替代this来引用函数对象
  2. 方法2:foo(index)修改成foo.call(foo,index) ,通过绑定方式,强制让this指向函数对象foo
  • 2、错误2:this指向函数的作用域

this在任何情况下都不指向函数的词法作用域,那么 this到底应该是指向谁?This在运行时才进行绑定,所以在定义时this对指向谁是未知的,只有在运行时才能确认指向谁,且实际上this最终指向的是那个调用它的对象。

判断this,可以根据优先级来判断:

  1. new 中调用则绑定的是新创建的对象
  2. 使用 call、apply 调用是指向指定对象
  3. 如果在某上下文对象中调用则指向上下文对象
  4. 若不是以上三种情况则可能绑定到undefined或全局对象