This 指向

this 指向概述

在全局作用域下,this 指向 window 对象。在实际开发中我们几乎不会在全局作用于下使用 this,通常都是在函数中使用 this

所有函数在被调用时,都会创建一个执行上下文,这个执行上下文会包含函数执行时所需的所有信息。this 也是其中的一个信息。

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

fn(); // window

const person = {
  name: "张三",
  sayName: fn
};

person.sayName(); // person

从上面的案例中我们可以看到,函数在调用时,JavaScript 会默认为 this 绑定一个值。this 的值取决于调用方式以及调用的位置。并且 this 的值在函数执行时(运行时)才能确定,不是在函数定义时确定的。

绑定规则

默认绑定

在独立调用函数,即函数没有被绑定到某个对象上进行调用,通常会默认绑定 this,并且函数中的 this 指向全局对象 window

普通函数调用

函数调用链

将函数作为参数传递

上述示例中,在真正调用函数的位置,并没有进行任何的对象绑定,只是一个独立函数的调用,因此 this === windiw

隐式绑定

在隐式绑定中,函数的调用通常是某个对象发起的。

显式绑定

call、apply

bind

内置函数

有些时候,我们会调用一些 JavaScript 内置的函数,或者一些第三方库中的内置函数。

这些内置函数要求我们传入另外一个函数,我们自己并不会显示的调用这些函数,而是 JavaScript 内部去自动调用。

在上述示例中,thiswindow,在 setTimeout 内部是通过 apply 进行绑定的 this 对象,并且绑定的是全局对象。

new 绑定

JavaScript 中的函数可以当作一个类的构造函数来使用,在使用 new 关键字调用函数时,会执行如下操作:

  1. 创建一个全新的对象;

  2. 这个新对象会被执行 Prototype 连接;

  3. 这个新对象会绑定到函数调用的 this 上;

  4. 如果函数没有返回其它对象,表达式会返回这个新对象;

规则优先级

默认规则的优先级最低

显示绑定优先级高于隐式绑定

new 绑定优先级高于隐式绑定

new 绑定优先级高于bind

总结:new 绑定 > 显示绑定(bind)> 隐式绑定 > 默认绑定

this 绑定规则之外

忽略显示绑定

如果在显示绑定中,我们传入一个 null 或者 undefined,那么这个显示绑定会被忽略,使用默认绑定规则:

间接函数引用

箭头函数

箭头函数不遵循 this 的四种绑定规则,箭头函数没有自己的 this,它的 this 继承自父级执行上下文。

在上面的示例中,在 setTimeout 中拿到的 thiswindow,因此我们需要在上层作用于定义额外的变量来绑定this

上面的代码中,箭头函数并不绑定 this 对象,那么 this 对象就会引用上层作用域中对应的 this

最后更新于

这有帮助吗?