深入理解JavaScript this绑定规则

 更新时间:2025年07月29日 09:26:02   作者:喜欢代码的新之助  
在 JavaScript 中,this 是一个非常重要的关键字,this 的指向并不是固定的,而是根据函数的调用方式动态决定的,本文就来介绍一下JavaScript this绑定规则,感兴趣的可以了解一下

this绑定规则

this在全局作用域下指向

  • 全局作用域下的this指向window
  • 如果给元素的事件行为绑定函数,那么函数中的this指向当前被绑定的那个元素
  • 函数中的this,要看函数执行前有没有., 有.的话,点前面是谁,this就指向谁,如果没有点,指向window
  • 自执行函数中的this永远指向window
  • 定时器中函数的this指向window
  • 构造函数中的this指向当前的实例
  • call、apply、bind可以改变函数的this指向
  • 箭头函数中没有this,如果输出this,就会输出箭头函数定义时所在的作用域中的this

this的指向和函数所处的位置无关,与函数被调用的方式有关

默认绑定

当函数是直接调用,而没有被绑定到某个对象上进行调用时,this指向window

const obj = {
	name: '张三',
  foo: function () {
    console.log(this)
  }
}
const fn = obj.foo
fn() // window

隐式绑定

通过某个对象进行调用

const obj1 = {
  name:'obj1',
  foo: function () {
    console.log(this)
  }
}

const obj2 = {
  name:'obj1',
  // 只是让foo指向0bj1.foo,但是并没有调用
  foo: obj1.foo
}

// foo函数是由obj2进行调用的
obj2.foo() // {name: 'obj1', foo: ƒ}

显式绑定

通过call()apply()bind()方法进行调用,明确的改变函数的this指向

function sum (num1, num2, num3) {
  console.log(num1 + num2 + num3, this);
}
sum.call('call', 1, 2, 3); // 6 String {'call'}
sum.apply('apply', [1, 2, 3]); // String {'apply'}
const fn = sum.bind('bind', 1, 2, 3);
fn(); // 6 String {'bind'}

默认绑定和显示绑定冲突时,显示绑定的优先级更高

new绑定

  1. JavaScript中的函数可以当做一个类的构造函数来使用,也就是使用new关键字

  2. 使用new关键字来调用函数是,会执行如下的操作:

    1. 在内存中创建一个新的空对象,如obj
    2. 对新创建的对象obj执行prototype连接(obj.__proto__ = 函数.prototype
    3. 让this指向这个新的对象obj
    4. 执行构造函数里面的代码,给这个对象添加属性和方法
    5. 返回这个新对象obj(所以构造函数里面不需要return)
    function Person (name) {
      this.name = name
    }
    
    const person1 = new Person('张三');
    person1.name // 张三
    const person2 = new Person('李四');
    person2.name // 李四
    

绑定优先级

默认规则this绑定的优先级最低

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

function foo () {
  console.log(this);
}
const obj = {
  name: '张三',
  fn: foo.bind('bind')
}
obj.fn() // String {'bind'}

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

const obj = {
  name: '张三',
  foo: function () {
    console.log(this);
  }
}
var fn = new obj.foo(); // foo {}

new绑定优先级高于显示绑定(new绑定优先级最高)

function Foo () {
  console.log(this) // Foo {}
}
var bar = Foo.bind('bind')
var foo = new Foo()
  • 注意new关键字无法和call()/apply()一起使用,因为new、call()、apply()都是直接调用函数

特殊情况的this

  • 箭头函数:不遵循上述规则,this由外层作用域决定
  • DOM事件处理函数:通常this指向触发事件的元素
  • setTimeout/setInterval回调:在非严格模式下默认指向全局对象

到此这篇关于深入理解JavaScript this绑定规则的文章就介绍到这了,更多相关JavaScript this绑定规则内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • JS实现深拷贝的几种简单方法示例

    JS实现深拷贝的几种简单方法示例

    深拷贝和浅拷贝是在JavaScript中复制对象或数组时经常遇到的概念,下面这篇文章主要给大家介绍了关于JS实现深拷贝的几种简单方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • JS实现DOM节点插入操作之子节点与兄弟节点插入操作示例

    JS实现DOM节点插入操作之子节点与兄弟节点插入操作示例

    这篇文章主要介绍了JS实现DOM节点插入操作之子节点与兄弟节点插入操作,涉及JavaScript节点的创建、添加简单操作技巧,需要的朋友可以参考下
    2018-07-07
  • js简单获取表单中单选按钮值的方法

    js简单获取表单中单选按钮值的方法

    这篇文章主要介绍了js简单获取表单中单选按钮值的方法,涉及javascript针对form表单元素的遍历与查找相关操作技巧,需要的朋友可以参考下
    2016-08-08
  • 微信小程序实现弹出层效果

    微信小程序实现弹出层效果

    这篇文章主要为大家详细介绍了微信小程序实现常见弹出层效果 ,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • element plus表格的表头和内容居中的实现代码

    element plus表格的表头和内容居中的实现代码

    这篇文章主要介绍了element plus表格的表头和内容居中的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • JavaScript队列、优先队列与循环队列

    JavaScript队列、优先队列与循环队列

    这篇文章主要为大家详细介绍了JavaScript队列、优先队列与循环队列的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • JavaScript设计模式中的桥接和中介者模式

    JavaScript设计模式中的桥接和中介者模式

    这篇文章主要介绍了JavaScript设计模式中的桥接和中介者模式,桥接设计模式是一种偏向于组合的设计模式,而非继承的设计模式,实现的细节从一个模块推送给另一个具有单独模块的对象,而中介者设计模式是指通过一个中介者对象封装一系列的对象交互
    2022-06-06
  • JavaScript prototype对象的属性说明

    JavaScript prototype对象的属性说明

    JavaScript中对象的prototype属性,是用来返回对象类型原型的引用的。我们使用prototype属性提供对象的类的一组基本功能。并且对象的新实例会”继承”赋予该对象原型的操作。但是这个prototype到底是怎么实现和被管理的呢?
    2010-03-03
  • 原生js实现简易计算器

    原生js实现简易计算器

    这篇文章主要为大家详细介绍了原生js实现简易计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • js实现延迟加载的几种方法详解

    js实现延迟加载的几种方法详解

    今天小编就为大家分享一篇关于js实现延迟加载的几种方法详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01

最新评论