JavaScript 中 this 的值如何理解

 更新时间:2026年01月24日 12:01:26   作者:二叉树果实  
文章介绍了JavaScript中this值的5种判断方式,包括函数调用、对象方法调用、构造函数调用、apply/call/bind方法调用和箭头函数中的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 对象上)

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

2.对象方法调用

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

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

关键反例:

const john = {
  name: "john",
  callJohn() {
    console.log(this.name);
  },
};
const fn = 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 不会立即执行,而是会返回新的函数。

举例如下:

function greet(greeting, punctuation) {
  console.log(`${greeting}, I am ${this.name}${punctuation}`);
}
const person = {
  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

到此这篇关于如何解释JavaScript 中 this 的值?的文章就介绍到这了,更多相关js this值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • js保存当前路径(cookies记录)

    js保存当前路径(cookies记录)

    曾经做了一个取消订单的功能。这个功能在个人中心里面有,在订单的详细页面也有。按照正常的思路,这两块都可以提交到相同的action去处理,但是返回的页面是不一样的,都是返回到当前页面就可以了。
    2010-12-12
  • 将string解析为json的几种方式小结

    将string解析为json的几种方式小结

    将string解析为json的几种方式小结,需要的朋友可以参考下。
    2010-11-11
  • 一文搞懂TypeScript的安装、使用、自动编译的教程

    一文搞懂TypeScript的安装、使用、自动编译的教程

    TypeScript 是一种由微软开发的开源、跨平台的编程语言。它是 JavaScript 的超集,最终会被编译为 JavaScript 代码,关于TypeScript的安装、使用、自动编译很多朋友不是很清楚,今天抽空给大家普及下,感兴趣的朋友一起看看吧
    2021-06-06
  • 响应式表格之固定表头的简单实现

    响应式表格之固定表头的简单实现

    下面小编就为大家带来一篇响应式表格之固定表头的简单实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • livereload工具实现前端可视化开发【推荐】

    livereload工具实现前端可视化开发【推荐】

    本文将介绍一个工具--livereload。这是一款能根据你本地文件(html、css、js)的变化,自动跟踪刷新浏览器的实时刷新工具,有了这个工具,会大大减轻你刷新页面的工作量。下面跟着小编一起来看下吧
    2016-12-12
  • JavaScript数据结构之双向链表

    JavaScript数据结构之双向链表

    这篇文章主要为大家详细介绍了JavaScript数据结构之双向链表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • javascript手工制作悬浮菜单

    javascript手工制作悬浮菜单

    这篇文章主要介绍了javascript手工制作悬浮菜单,主要也是想自己练练手,感觉还不错,这里推荐给大家。
    2015-02-02
  • javascript容错处理代码(屏蔽js错误)

    javascript容错处理代码(屏蔽js错误)

    本文主要介绍了javascript的容错处理代码。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • 兼容ie和firefox js关闭代码

    兼容ie和firefox js关闭代码

    最近做项目的时候碰到一个问题: 在js里面使用window.close(),IE下工作正常,但是FireFox下有时可以,有时不行。
    2008-12-12
  • 前端将dom转换成图片的方法(使用dom-to-image)

    前端将dom转换成图片的方法(使用dom-to-image)

    这篇文章主要介绍了使用轻量级的dom-to-image插件将DOM元素转换为图片并下载,该插件支持多种图片格式,如SVG、PNG、JPEG等,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-01-01

最新评论