从绑定规则到箭头函数彻底讲解JavaScript中this

 更新时间:2026年05月28日 08:30:18   作者:小KK_  
this是js中的一个关键字,它代表当前作用域的上下文环境,而且随着上下文的改变而动态变化,这篇文章主要介绍了从绑定规则到箭头函数彻底讲解JavaScript中this的相关资料,需要的朋友可以参考下

前言

对于许多JavaScript的初学者来说,this是一个让人又爱又恨的关键词,它的指向灵活多变,稍有不慎就会出现意想不到的结果。但是掌握this的绑定规则却是写出优雅,可复用的代码的必经之路。所以,本文将带你系统梳理this的来龙去脉,彻底搞懂它的工作机制。

一.为什么要有this

this 是 JS 中的一个关键字,它提供了一种更优雅的方式隐式的传递一个对象的引用,可以让代码更简洁易于复用。

// 优雅的 this
const alice = {
  name: 'Alice',
  age: 25,
  introduce() {
    console.log(this.name);
  }
};
alice.introduce(); // this隐式传递了 alice 对象

二. this 可以出现在哪里?

1.全局

在浏览器中,全局中 this 指向 window 对象。

console.log( this === window);// true

2.函数体内

函数内部的 this 指向取决于如何调用,而不是在哪里定义,这也是 this 最复杂也是最灵活的地方。

三.this 的绑定规则

1.默认绑定

当函数独立调用时,函数中的 this 指向 window 对象

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

foo(); // window

2.隐式绑定

当一个函数被一个上下文对象所拥有,并被该对象调用,函数中的 this 指向该对象。

const obj = {
  name: 'obj',
  say() {
    console.log(this.name);
  }
};
obj.say(); // 'obj'

当一个函数被多层对象调用,函数中的 this 指向最近的那个对象

function foo() {
  console.log(this.a);
}
var obj = {
  a: 1,
  foo: foo,
};

var oo = {
  a: 2,
  foo: obj,
};

oo.foo.foo(); // 1  离 foo 最近的对象是 obj 所以 this 指向 obj 对象

3.显示绑定

JavaScript中提供了三种方法 call, applybind,可以强制指定函数中的this

  • call :立即调用函数,参数逐个传递。
    fn.call(obj, x, y)

  • apply:立即调用函数,参数以数组方式传递。
    fn.apply(obj, [x, y]

  • bind:返回一个新的函数。
    fn.bind(obj, x, y)()

4.new 绑定

当一个函数被用作构造函数时, this 会指向新创建的那个实例对象。new的过程如下:

  1. 创建一个全新的空对象。

  2. 将这个空对象的 __proto__ 指向构造函数的 prototype

  3. 将构造函数内的 this 绑定到该新对象;

  4. 执行构造函数代码;

  5. 如果构造函数没有返回对象,则返回这个新对象。

function Person(name) {
  this.name = name;
  this.say = function() {
    console.log(this.name);
  };
}
const alice = new Person('Alice');
alice.say(); // 'Alice',this 指向 alice 实例

四.箭头函数中的 this

箭头函数没有 this 这个概念,所以写在箭头函数中的 this ,是它外层非箭头函数的。

function foo() {
  var fn = () => {
    this.a = 2;
  };
  fn();
}

var obj = {
  a: 1,
  bar: foo,
};
obj.bar(); // this 指向的是 obj 对象,所以相当于最后执行obj.a = 2,obj 对象中 a 的值变为 2
console.log(obj);  //obj { a: 2, bar: foo}

注意:如果箭头函数外面也没有普通函数,那么 this 指向全局

const fn = () => {
  console.log(this); // window
};
fn();

五.一表总结

绑定类型规则简述示例场景
默认绑定独立调用函数,this 指向全局fn()
隐式绑定通过对象调用,this 指向该对象(最近的那个)obj.fn()
显式绑定使用 call/apply/bind 强制指定 thisfn.call(obj)
new 绑定作为构造函数调用,this 指向新实例new Foo()
箭头函数没有自己的 this,继承外层非箭头函数的 this() => console.log(this)

到此这篇关于从绑定规则到箭头函数彻底讲解JavaScript中this的文章就介绍到这了,更多相关JS中this绑定规则到箭头函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于JavaScript实现移动端TAB触屏切换效果

    基于JavaScript实现移动端TAB触屏切换效果

    我们使用移动端时可以通过触屏手势左右滑动来切换TAB栏目,如网易新闻等APP栏目切换。我们说的TAB一般由导航条和TAB对应的内容组成,切换导航条上的标签同时标签对应的内容也会跟着切换。本文将结合实例给大家介绍一个移动端TAB触屏切换效果。
    2015-10-10
  • 微信小程序开发之实现一个跑步小程序

    微信小程序开发之实现一个跑步小程序

    本文将开发一个简易的微信跑步小程序,用到的方法是wx.onLocationChange,可以监听实时地理位置变化事件,感兴趣的小伙伴可以了解一下
    2022-08-08
  • 浅析JavaScript中的隐式类型转换

    浅析JavaScript中的隐式类型转换

    在我们学习或者工作中,或多或少会遇到过隐式类型转换,但是为什么会有这种现象?这种现象背后的原理是什么?可能是大多数人没有思考过的,本文就来和大家一起浅析一下
    2023-03-03
  • 斜45度寻路实现函数

    斜45度寻路实现函数

    没事写个寻路的,很简单,有需要的朋友可以参考下。
    2009-08-08
  • js实现图片淡入淡出效果

    js实现图片淡入淡出效果

    这篇文章主要为大家详细介绍了js实现图片淡入淡出效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 关于ES6的六个小特性(二)

    关于ES6的六个小特性(二)

    ES6提供了大量新的好的东西,在过去的一年内,浏览器提供商做了大量的辛勤工作将新的语言特性更新到他们的浏览器中。尽管有重大的更新,很多小的语言更新另我眼前一亮,下面这篇文章主要介绍了关于ES6的六个小特性,需要的朋友可以参考下。
    2017-02-02
  • 详解Javascript动态操作CSS

    详解Javascript动态操作CSS

    本文我们会讨论如何通过 JavaScript 在运行时操作 CSS,从而动态地更新应用到我们的元素上的式样。本文所用的技术是我们已经看到过的,但在利用 CSS DOM 来进行操作的时候还需要注意几个特殊点。
    2014-12-12
  • javascript客户端遍历控件与获取父容器对象示例代码

    javascript客户端遍历控件与获取父容器对象示例代码

    本篇文章主要是对javascript客户端遍历控件与获取父容器对象示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • js几个不错的函数 $$()

    js几个不错的函数 $$()

    js几个不错的函数 $$()...
    2006-10-10
  • 一文详解javascript语言中的类(class)

    一文详解javascript语言中的类(class)

    class类是一种抽象的体现,用来表示具有相同特性的一类事物,是面向对象编程不可缺少的工具,下面这篇文章主要介绍了javascript语言中类class的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-04-04

最新评论