news 2026/7/27 2:31:25

如何解释JavaScript 中 this 的值?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何解释JavaScript 中 this 的值?

文章目录

  • 如何解释Javascript中的this值?
    • 1.函数调用
    • 2.对象方法调用
    • 3.构造函数调用
    • 4.apply、call、bind 方法调用
    • 5.箭头函数中的this

如何解释Javascript中的this值?

在 JavaScript 中,this的值是动态的,通常会由被使用的函数来决定。所以,影响this的值不是定义的时候,关键在于会在哪里被调用。

this 值 5 种判断方式

  • 函数调用
  • 物体方法调用
  • 构造函数调用
  • apply call bind 方法调用
  • 箭头函数中的 this

1.函数调用

当一个函数不是属于一个对象中的方法时,直接作为函数来调用时,this 会指向全局对象,在浏览器中,默认为 Window。但有一点要注意的是,如果是在严格模式下,this 为 undefined。

例子如下,因为是一般函数调用,this 总是指向 Window,所以一个输出结果是 Window。而因为在全局范围中用 var 定义 name 变量。name 变量会绑定在 Window 对象上,第二个输出结果也就等同于 window.name 的值(如果是用 let 定义,并不会绑定在 Window 对象上)

varname="John";functioncallThis(){console.log(this);console.log(this.name);}callThis();// Window// John

2.对象方法调用

当一个函数是作为一个对象的方法来调用时,this 会指向这个对象

constjohn={name:"john",callJohn(){console.log(`hello,${this.name}`);},};john.callJohn();// hello, john
this 的指向取决于函数被调用的方式,而不是函数定义的位置。 因为使用的时候是 join.xxx,对象调用。

关键反例:

constjohn={name:"john",callJohn(){console.log(this.name);},};constfn=john.callJohn;fn();// undefined(或严格模式下报错)

3.构造函数调用

当一个函数使用 new 调用的时候,会出现如下情况

重点来看this 指针的调用

第一处 this 指针

  • 构造函数执行时,this 指向新创建的 object,所以 this.brand = brand 实际是在给 object 添加属性。

第二处 this 指针

  • 调用 newIPhone.getBrand() 时,因为是对象方法调用,this 自动指向 newIPhone,所以能正确返回该对象的 brand。

4.apply、call、bind 方法调用

我们也可以使用applycallbind方法来指定this指向的对象。

  • apply方法接受两个参数,第一個是 this 绑定的对象,第二个要放入要传入函数的数组参数,并执行这个函数。

  • call方法类似为apply,唯一不同的地方是,apply第二个参数是数组,但call则是参数逐个传。

  • bind方法传入一个对象和要传入的参数,不同于applycallbind不会立即执行,而是会返回新的函数。

举例如下:

functiongreet(greeting,punctuation){console.log(`${greeting}, I am${this.name}${punctuation}`);}constperson={name:"Alice",};

apply —— 立即执行,参数用数组传

greet.apply(person,["Hi","~"]);//Hi, I am Alice~

call —— 立即执行,参数逐个传

greet.call(person,"Hello","!");//Hi, I am Alice~

bind —— 不立即执行,返回一个新函数

const boundGreet = greet.bind(person, "Hey");

此时:

  • this 已经被固定为 person
  • “Hey” 被提前绑定为第一个参数
  • 函数还没执行

执行返回的新函数:

boundGreet("!!!");// Hey, I am Alice!!!

补充知识点:

为什么 bind 常用于事件 / 回调? setTimeout(greet.bind(person, "Hello"), 1000);
因为:setTimeout 会丢失原来的 this bind 可以提前把 this 固定住

5.箭头函数中的this

ES6 中介紹了一种新的函数形式 - 箭头函数(arrow function)。但要注意的是,箭头函数并没有属于自己的this值,箭头函数的this会从他的外层函数继承,若他的外层函数也同为箭头函数 ,則回继续向上找,直到找到全局环境的预设this值(例如:浏览器中就是window)。

let getThis = () => this; console.log(getThis() === window); // true
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/27 1:31:24

Qwen-Image-Layered完整生态:配套text_encoders怎么装?

Qwen-Image-Layered完整生态:配套text_encoders怎么装? Qwen-Image-Layered 是阿里通义千问团队推出的创新图像生成模型,其核心能力在于将一张图像自动分解为多个RGBA图层。这种结构化的图层表示方式不仅保留了原始图像的视觉完整性&#xf…

作者头像 李华
网站建设 2026/7/27 1:31:56

C盘空间不足的原因有哪些?会导致哪些问题?

theme: default themeName: 默认主题 c盘空间不足是一个常见又烦人的电脑问题,它可能慢慢发生,几乎不被察觉,直到某天你收到警告信息或电脑开始表现异常,这个驱动器通常存放你的windows操作系统,关键程序和个人文件,它需要呼吸空间才能正常运行,当它变得太满,就不只是没有空间放…

作者头像 李华
网站建设 2026/7/26 4:04:39

AI如何提升SonarQube代码分析效率?

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个AI辅助的SonarQube插件,能够自动分析代码质量,识别潜在问题,并提供智能修复建议。插件应支持多种编程语言,能够与SonarQube…

作者头像 李华
网站建设 2026/7/26 13:33:27

换电脑前必做:APPDATA精简迁移全攻略

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 设计一个APPDATA迁移助手工具,具有以下功能:1) 智能分析APPDATA目录结构 2) 按应用程序分类显示文件 3) 提供迁移建议(保留/清理) 4) 创建精简版迁移包 5) …

作者头像 李华
网站建设 2026/7/26 15:16:32

15分钟搭建联邦学习原型:快马平台极速体验

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 在快马平台上快速创建一个联邦学习原型,要求:1) 使用预置的联邦学习模板;2) 处理Iris数据集进行分类任务;3) 包含完整的前端界面展示…

作者头像 李华
网站建设 2026/7/25 15:27:45

实测对比:Cursor国内使用效率提升300%的秘诀

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个Cursor效率分析工具,功能包括:1. 代码编写速度测试模块;2. bug发现率对比工具;3. 代码质量评估系统;4. 个性化效…

作者头像 李华