浅谈一下对于 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. DDD领域驱动设计 (C# 整理自“老张的哲学”)

    大话DDD领域驱动设计 概念 Domain Driven Design 领域驱动设计 第一个D(Domain): 领域:指围绕业务为核心而划分的实体模块. 第二个D(Driven): 驱动:这里的驱动 ...

  2. 电脑面试两道问题(python+shell)

    最近面试电脑代码面试遇到两个问题,供大家参考一下一.python脚本: 手写一个函数,实现两个数相加,并使用unittest与pytest工具测试函数正确性. 1.unnitest进行测试: impo ...

  3. python常见面试题讲解(三)明明的随机数

    题目描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对 ...

  4. 43 干货系列从零用Rust编写负载均衡及代理,内网穿透方案完整部署

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代 ...

  5. Vue- 绑定的图片不显示

    需要通过 require包裹 <template> <div> {{user.username}}: <img :src="user.avatar" ...

  6. Go-数组-切片

  7. [转帖]shell编程:变量知识进阶(三)

    https://www.cnblogs.com/luoahong/articles/9154309.html 1 Shell特殊位置变量 范例1:$n的实践例子 1 2 3 4 5 6 7 8 9 1 ...

  8. [转帖]SkyWalking告警使用

    SkyWalking告警 SkyWalking提供了强大的监控告警功能,在监控到应用出现问题的时候,会调用webhook或者gRPC hook或者Wechat DingDing等工具报告警告信息 而且 ...

  9. [转帖]深入理解mysql-第五章 InnoDB记录存储结构-页结构

    前言: 页是InnoDB管理存储空间的基本单位,上一章我们主要分析了页中的主要的构成行的存储结构-行格式,其中简单提了一下页的概念.这章我们详细讲解一下页的存储结构. 一.数据页结构 前边我们简单提了 ...

  10. [转帖]strace分析sqlplus登录慢问题

    一. 问题分析 有时会遇到sqlplus / as sysdba登录非常慢的问题,由于还没登录,通过数据库等待事件一般看不出来啥,需要用到strace这个分析利器.strace有很多参数,后面会列出, ...