浅谈一下对于 js 中的 this 的理解


对于 this 值的定义:

简单来说 this 是一个对象,这个对象具体的值是什么,取决于运行时的环境,即代码执行时的环境。

MDN:

当前执行上下文( global 、 function 或 eval )的一个属性,在非严格模式下,总是指向一个 对象 ,在严格模式下可以是 任意值

解释:

  • global 是指全局对象,例如浏览器环境下的 window ,node 环境下的 global
  • eval 是指的 eval() 函数,它可以将传入的字符串当作 js 代码执行。(尽量不要使用,执行速度更慢且容易造成安全问题)

稍微简单的理解是:

在全局环境下,this 指全局对象;在函数中,如果该函数是对象(object)或者类(class)的属性,this 指代当前对象或者类,如果是直接声明并执行的函数,则是全局对象(非严格模式)。以上的总结在大部分场景下是正确的。

具体到代码环境下 this 所代表的值:

以下列举一些常见的代码片段:

注释 // 后面会说明 this 指代的值,以方便理解,以下代码都是在非任意 {} 包裹的代码块中实现

console.log(this); // window
function test() {
console.log(this); // window
}
test();
setTimeout(function () {
console.log("---");
console.log(this); // window
console.log("---");
}, 100);
"use strict"; // 严格模式
function test2() {
console.log(this); //undefined
}
test2();
const person = {
id: 1,
name: "tom",
do: function () {
console.log(this.id); // 这里的 this 就是指代 person 这个对象
console.log("do something about");
},
};
class food {
constructor(name) {
this.name = name; // 这里的 this 指 food 这个类
}
}
class cookedFood extends food {
constructor(name, type) {
// console.log(this); // 会报错,子类必须在调用 super 方法后才能使用 this
super(name);
this.type = type; // 这里的 this 指 cookedFood 这个类
}
} new cookedFood("鱼", "红烧");
const obj = { a: 1 };
var a = 0;
function whatThis() {
return this.a;
}
whatThis(); // 0 this 指 window
whatThis.call(obj); // 1 this 指 obj
whatThis.apply(obj); // 1 this 指 obj

其它注意点:

  • 要注意开始提到的 在严格模式下可以是任意值的概念

在非严格模式下使用 callapply 时,如果用作 this 的值不是对象,则会被尝试转换为对象。nullundefined 被转换为全局对象。原始值如 7'foo' 会使用相应构造函数转换为对象。因此 7 会被转换为 new Number(7) 生成的对象,字符串 'foo' 会转换为 new String('foo') 生成的对象。

  • 在箭头函数中,this与封闭词法环境的this保持一致。在全局代码中,它将被设置为全局对象。

如果将this传递给callbind、或者apply来调用箭头函数,它将被忽略。不过你仍然可以为调用添加参数,不过第一个参数(thisArg)应该设置为null

浅谈一下对于 js 中的 this 的理解的更多相关文章

  1. 浅谈线程池(中):独立线程池的作用及IO线程池

    原文地址:http://blog.zhaojie.me/2009/07/thread-pool-2-dedicate-pool-and-io-pool.html 在上一篇文章中,我们简单讨论了线程池的 ...

  2. 【ASP.NET MVC系列】浅谈NuGet在VS中的运用

    一     概述 在我们讲解NuGet前,我们先来看看一个例子. 1.例子: 假设现在开发一套系统,其中前端框架我们选择Bootstrap,由于选择Bootstrap作为前端框架,因此,在项目中,我们 ...

  3. 浅谈surging服务引擎中的rabbitmq组件和容器化部署

    1.前言 上个星期完成了surging 的0.9.0.1 更新工作,此版本通过nuget下载引擎组件,下载后,无需通过代码build集成,引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎 ...

  4. 浅谈如何检查Linux中开放端口列表

    给大家分享一篇关于如何检查Linux中的开放端口列表的详细介绍,首先如果你想检查远程Linux系统上的端口是否打开请点击链接浏览.如果你想检查多个远程Linux系统上的端口是否打开请点击链接浏览.如果 ...

  5. 【Unity游戏开发】浅谈Lua和C#中的闭包

    一.前言 目前在Unity游戏开发中,比较流行的两种语言就是Lua和C#.通常的做法是:C#做些核心的功能和接口供Lua调用,Lua主要做些UI模块和一些业务逻辑.这样既能在保持一定的游戏运行效率的同 ...

  6. 浅谈使用spring security中的BCryptPasswordEncoder方法对密码进行加密与密码匹配

    浅谈使用springsecurity中的BCryptPasswordEncoder方法对密码进行加密(encode)与密码匹配(matches) spring security中的BCryptPass ...

  7. JS中原型链的理解

    new操作符具体干了什么呢?其实很简单,就干了三件事情. var obj = {}; obj.__proto__ = Base.prototype; Base.call(obj); 第一行,我们创建了 ...

  8. js中的this怎么理解

    本博客供自己学习备忘, js中的this感觉很混乱,目前还有不少地方搞得不是很清楚,看到一篇不错的文章,先摘下来 this是Javascript语言的一个关键字它代表函数运行时,自动生成的一个内部对象 ...

  9. JS中对于prototype的理解

    JS中的prototype是JS中比较难理解的一个部分 本文基于下面几个知识点: 1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原型法的主要思想是,现在有1个类A,我想要创建一个 ...

  10. js中boolean类型的理解

    <html> <head> <script type="text/javascript"> var x="12"; aler ...

随机推荐

  1. Qt开发-共享内存使用范例,配合开发者密钥使用后台调试程序或者进入调试模式

    共享内存 就之前不是开发了一个Leventure_DeveloperKey用以调试程序嘛,在这里简单聊一下调试模式的方案. 这里的调试分为了两种,一种是调试模式,一种是开发者模式.需要这两种模式的原因 ...

  2. C++ 利用模板偏特化和 decltype(()) 识别表达式的值类别

    刚刚看到一篇 C++ 博客,里面讲到用模板偏特化和 decltype() 识别值类别:lvalue glvalue xvalue rvalue prvalue.依照博客的方法试了一下,发现根本行不通. ...

  3. 【收集】embed

    序 链接 备注 1 适用于嵌入式单片机的差分升级通用库+详细教程_风吹花中花吹风的博客-CSDN博客 差分升级包制作与还原 2 前言 · 给新手的两轮自平衡小车开发实战指南 (miaowlabs.co ...

  4. [转帖]六千字带你了解 Oracle 统计信息和执行计划

    https://cloud.tencent.com/developer/article/1616706 大家好,我是 JiekuXu,很高兴又和大家见面了,今天分享下 Oracle 统计信息和执行计划 ...

  5. Nginx reload重新加载配置文件的异常情况

    Nginx reload重新加载配置文件的异常情况 背景 临近年底, 很多业务工作量都上来了. 今天同事告知, nginx的log 里面出现了大量的 too many openfiles 的提示信息. ...

  6. [转帖]SQLServer的UTF8支持

    排序规则和 Unicode 支持 - SQL Server | Microsoft Learn UTF-8 支持 SQL Server 2019 (15.x) 完全支持广泛使用的 UTF-8 字符编码 ...

  7. [转帖]clickhouse 超底层原理& 高可用集群 实操(史上最全)

    https://www.cnblogs.com/crazymakercircle/p/16718469.html 文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵 ...

  8. ingress nginx 支持的K8S版本以及nginx版本信息

  9. [转帖]一文理清 TiDB 与 MySQL 中的常用字符集及排序规则

    https://tidb.net/blog/0c5b6025   1.1. 字符集与编码规则 字符集(character set)即为众多字符的集合.字符集为每个字符分配一个唯一的 ID,称为 &qu ...

  10. [转帖]MioIO读/写性能测试

    https://www.jianshu.com/p/a0a84f91b16f   image.png COSBench是Intel团队基于java开发,是一个测试云对象存储系统的分布式基准测试工具,全 ...