this

作者:李挺
链接:https://www.zhihu.com/question/19636194/answer/123274198
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

关于 this 的描述,曾经在 stackoverflow 上看到了一篇回答写的非常详尽,下面的文字是一个简单的总结:

(一)定义:是一个关键字,用来计算当前执行上下文中 ThisBinding 的值。
  • 定义推断:作为一个关键字,既不是变量,又不是对象属性,因此不能给 this 赋值,而且 this 也不受作用域的限制,嵌套函数中的 this 不会从调用它的函数中继承 this。

(二)ThisBinding 的值(this 的计算结果):
  1. 全局执行上下文中——global 对象
  2. eval() 中
    • 如果 eval() 是直接调用,那么 Thisbinding 的值取决于 eval() 所处的执行上下文;
    • 如果是间接调用,那么 ThisBinding 的值为 global 对象;【注1】
3. 函数中
    • 作为普通的函数调用,为 global(非严格模式下)或 undefined (严格模式下);
    • 作为某个对象的方法调用,那么 ThisBinding 的值就是这个对象;
    • 作为构造函数调用,ThisBinding 的值为所创建的新的空对象;【注2】
    • 间接调用下,有八种函数可以在参数中指定 ThisBinding 的值
Function.prototype.apply(thisArg, argArray);
Function.prototype.call(thisArg[, arg1[, arg2, ...]]);
Function.prototype.bind(thisArg[, arg1[, arg2, ...]]);
Array.prototype.every(callbackfn[, thisArg]);
Array.prototype.some(callbackfn[, thisArg]);
Array.prototype.forEach(callbackfn[, thisArg]);
Array.prototype.map(callbackfn[, thisArg]);
Array.prototype.filter(callbackfn[, thisArg]);
      • 在 Function.prototype 下的函数,thisArg 指定其主体函数中的 ThisBinding 值;(thisArg 不一定与 ThisBinding 相等【注3】)
      • 在 Array.prototype 下的函数,thisArg 指定 callbackfn 中 ThisBinding 的值。

注解:
    1. eval 是通过表达式计算得到的,那么此时,eval 调用称之为间接调用,eval 中的代码在全局环境下执行。(例如:
      var x = 'outer';
      (function(){
      var x = 'inner';
      eval('console.log("直接调用: " + x)');        // 直接调用: inner
      (1, eval)('console.log("间接调用: " + x)');   // 间接调用: outer
      })();
      
    2. 构造函数的调用细节:构造函数调用之前会自动创建一个新的空对象,构造函数作为这个新对象的方法进行调用,所以构造函数通过 this 就可以初始化这个新对象,最后,这个新对象作为构造函数调用表达式的值,构造函数的 prototype 属性作为新对象的原型。
    3. 如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动指向 global 对象,同时如果 thisArg 是原始值的话,那么 ThisBinding 的值原始值的包装对象。

引用:
    1. javascript - How does the "this" keyword work?
    2. (1,eval)('this') vs eval('this') in JavaScript?
    3. Function.prototype.apply(),Function.prototype.call(),Function.prototype.bind()
    4. 《JavaScript 权威指南》第六版

转载于:https://www.cnblogs.com/yasepix/p/6198004.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeviceNet 消息类型

DeviceNet是一种低成本的通讯总线链接,具有开放现场网络标准,规范和协议都是开放的。DeviceNet将控制和数据融合在一起,信息具有数据标识区,网络利用标识区进行优先级仲裁,可以高效传送I/O数据。 DeviceNet有两种不同类…

【pyqt5学习——信号与槽】实例计时器(解决界面卡顿问题)

目录 一、方法一:另开线程 1、什么是信号与槽 1)GUI控件(信号)与槽 2)自定义信号与槽 2、实战1:计时器(不自定义信号槽和不使用多线程) 1)界面设计——利用qt-desi…

【转】为什么螺丝都是六角的?

6边形的螺丝拧60度就可以图形还原(不知道表述清楚没,见讨论中的解释)) 如果空间比较狭小,只要扳手能拧动60度就能安装上螺丝 这是在拧动角度和边长相互妥协后的产物 试想 如果是正方形,边长够长了&#xff…

用PHP和Websocket实现实时通讯

说到websocket大家一定不会陌生,WebSocket是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP请求完成,当浏览器和服务器握手成功后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可…

ABB SocketReceive 套接口 函数

SocketReceive函数使用方法: SocketReceive 从远程计算机接收数据。 SocketReceive 可以被客户端和服务器程序使用。 基本样例: 下述样例说明了 SocketReceive 的语法: Example 1 VAR string str_data; ... SocketRe…

【数据库学习笔记】——创建数据库连接对象connection

目录 connect函数的参数 创建连接对象连接MySQL代码 连接对象常见属性与方法 事务名词解释 课程视频链接: 第14节 Python操作数据库_哔哩哔哩_bilibili666https://www.bilibili.com/video/BV1q54y147KX?fromsearch&seid968950907021994347&spm_id_from3…

数据库常用增删改查记录等语句

1增 1.1【插入单行】insert [into] <表名> (列名) values (列值)例&#xff1a;insert into Strdents (姓名,性别,出生日期) values (开心朋朋,男,1980/6/15) 1.2【将现有表数据添加到一个已有表】insert into <已有的新表> (列名) select <原表列名> from &…

一个关于pynoi游戏的C语言编程

“去吧&#xff0c;秦&#xff0c;好好享受这个夜晚&#xff0c;我给你准备了一份礼物&#xff0c;希望你能喜欢。”小布莱克眨着眼睛笑道&#xff0c;狡猾的像一头小狐狸。转载于:https://www.cnblogs.com/jackey18/p/8260774.html

【数据库学习笔记】——cursor游标对象

目录 1、创建cursor对象 2、cursor对象常用方法 3、操作数据库的常见流程&#xff08;五部曲&#xff09; 课程视频链接&#xff1a; 第14节 Python操作数据库_哔哩哔哩_bilibili666https://www.bilibili.com/video/BV1q54y147KX?p2&spm_id_frompageDriver 1、创建cu…

ABB 压包指令PackRawBytes 解包指令UnpackRawBytes

ABB 压包指令PackRawBytes 解包指令UnpackRawBytes PackRawBytes- 将数据导入 rawbytes 数据。 使用方法 PackRawBytes 用于将 num, dnum, byte,或者 string类型的数据&#xff0c;打包到 rawbytes 类型的变量中. 基本举例 &#xff1a; VAR rawbytes …

Android Https相关完全解析 当OkHttp遇到Https

Android Https相关完全解析 当OkHttp遇到Https转载于:https://www.cnblogs.com/zhujiabin/p/5304617.html

基于ARM核AT75C220在指纹识别系统中应用

纹识别技术近年来逐渐成熟&#xff0c;在门禁、安防和金融等方面得到了越来越广泛的应用。典型的指纹识别系统是以指纹传感器和DSP处理器为核心构成。指纹传感器采集指纹图像&#xff0c;DSP处理器实时实现指纹识别算法。同时&#xff0c;通常的指纹识别系统还具有较强的通信能…

【数据库学习笔记】——创建数据库文件

目录 1、数据库基础知识 2、创建数据库文件 1、数据库基础知识 什么是数据库&#xff1f;——数据库是存放多个数据表的仓库&#xff0c;数据表可以理解为是二维数组 如上表所示&#xff0c;每个表由行列组成&#xff1a; 字段&#xff1a;每一列称之为一个字段&#xff0c;每…

岁月在流逝,从阿里退下来接近70后程序猿带给我的启示

大家好&#xff0c;今天为大家带来一个非常励志&#xff0c;让我反思的故事。今天为大家讲的是我父亲是如何用行动教会我成为程序员的。 岁月的锤炼 圆口接口的键盘&#xff0c;2003年的 有人问这个键盘难道没有擦过吗&#xff1f;不是的&#xff0c;是擦不掉的岁月痕迹。如果有…

浅谈工业机器人的运动停止

德系的工业机器人系统中&#xff0c;对于机器人停止运动&#xff0c;定义了3种模式&#xff0c;比如 KUKA 的工业机器人分别定义了 Stop 0 &#xff0c;Stop 1&#xff0c;Stop 2 (*注1)。这种定义模式是与机器人的机械结构和电气结构相关联的。 对于此&#xff0c;读者应该先了…

MySQL 数据表备份导出,恢复导入操作实践

因为经常跑脚本的关系&#xff0c; 每次跑完数据之后&#xff0c;相关的测试服数据库表的数据都被跑乱了&#xff0c;重新跑脚本恢复回来速度也不快&#xff0c;所以尝试在跑脚本之前直接备份该表&#xff0c;然后跑完数据之后恢复的方式&#xff0c;应该会方便一点。所以实践一…

js实现去重字符串

实现去重字符串主要是把重复的字符与原来的字符&#xff08;先push()进入一个数组存起来&#xff09;相匹配&#xff0c;如果match返回的不是null则说明重复&#xff0c;就删除掉&#xff1a; <script>var str prompt("请输入一个字符串&#xff1a;", "…

ABB 机器人 IsStopMoveAct 指令 - Is stop move flags active

IsStopMoveAct - Is stop move flags active 用法&#xff1a; IsStopMoveAct 用于得到当前或连接运动任务的 停止移动位状态。 is used to get the status of the stop move flags for a current or connected motion task. 基本示例&#xff1a; stopflag2:…

【数据库学习】——数据库可视化--Navicat下载安装连接教程

目录 进入网站 下载可视化软件 安装 双击桌面图标&#xff0c;选择试用 连接数据库 查看数据库中的表&#xff0c;如下所示 常用数据库有&#xff1a; MySQL、sqlite等 进入网站 Navicat | 产品https://www.navicat.com.cn/products 下载可视化软件 这里以数据库sql…

机器学习笔记1(K-近邻算法)

人生苦短&#xff0c;我用PythonK-近邻算法&#xff1a;简单来说&#xff0c;K-近邻算法就是采用测量不同特征值之间的距离方法进行分类优点&#xff1a;精度高、对异常值不敏感、无数据输入假定缺点&#xff1a;计算复杂度高、空间复杂度高适用范围&#xff1a;数值型、标称型…