深入理解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绑定规则内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • JavaScript闭包中难点深入分析

    JavaScript闭包中难点深入分析

    闭包是js的一个难点也是它的一个特色,是我们必须掌握的js高级特性,下面这篇文章主要给大家介绍了关于JavaScript闭包函数的相关资料,需要的朋友可以参考下
    2022-11-11
  • PWA介绍及快速上手搭建一个PWA应用的方法

    PWA介绍及快速上手搭建一个PWA应用的方法

    这篇文章主要介绍了PWA介绍及快速上手搭建一个PWA应用的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • 详解JS转换数值函数Number()、parseInt()、parseFloat()

    详解JS转换数值函数Number()、parseInt()、parseFloat()

    JS中有三种函数可以将非数值转换成数值:Number()、parseInt()和parseFloat()。接下来通过本文详细的给大家介绍JS转换数值函数Number()、parseInt()、parseFloat()的实例代码,感兴趣的朋友一起看看吧
    2018-08-08
  • 原生JavaScript+LESS实现瀑布流

    原生JavaScript+LESS实现瀑布流

    这篇文章主要介绍了原生JavaScript+LESS实现瀑布流的方法,附上了具体实例,这里推荐给有需要的小伙伴。
    2014-12-12
  • iframe一次下载多个文件实例

    iframe一次下载多个文件实例

    这篇文章主要为大家介绍了iframe一次下载多个文件实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • javascript中如何快速获取数组最后一个值

    javascript中如何快速获取数组最后一个值

    这篇文章主要介绍了javascript中如何快速获取数组最后一个值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • JavaScript递归函数定义与用法实例分析

    JavaScript递归函数定义与用法实例分析

    这篇文章主要介绍了JavaScript递归函数定义与用法,结合实例形式分析了javascript递归的原理、函数定义、使用方法及操作注意事项,需要的朋友可以参考下
    2019-01-01
  • JavaScript数组类型Array相关的属性与方法详解

    JavaScript数组类型Array相关的属性与方法详解

    这篇文章主要给大家介绍了关于JavaScript数组类型Array相关的属性与方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 实例代码详解javascript实现窗口抖动及qq窗口抖动

    实例代码详解javascript实现窗口抖动及qq窗口抖动

    这篇文章主要介绍了实例代码详解javascript实现窗口抖动及qq窗口抖动的相关资料,需要的朋友可以参考下
    2016-01-01
  • video.js添加自定义组件的方法

    video.js添加自定义组件的方法

    这篇文章主要介绍了videojs添加自定义组件的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12

最新评论