javascript class 方法的this指向问题
踩坑记录
JavaScript 的 class 里面有两种定义方法的方式
- 普通函数(fun1)
- 箭头函数(fun2)
class Obj {
func1() {
// write some code...
}
func2 = () => {
// write some code...
}
}
其中使用普通函数定义的方法,是保存在原型链上,被所有实例所共享
而用箭头函数定义的方法,是作为变量保存在每一个实例中

那么这两种定义方法还有什么不同嘛?
那就是this指向的问题!
如果我们平时只向下方代码这样使用方法,那么这两种不同的定义方法,自然没有区别
const obj1 = new Obj()
obj1.fun1()
obj1.fun2()
但是一旦你把这个类里面的方法传递给了另一个变量,一切就变得不一样起来了~
由于this是取决于运行时的上下文环境的
所以如果用普通函数定义的方法,被传递给了其他环境的变量
然后调用该方法,所打印的this应该是该方法被调用环境的this
而箭头函数由于没有this,或者说它的this在创建时就被绑定了
所以你传递箭头函数,它的this指向就会一直是原环境。
javascript class 方法的this指向问题的更多相关文章
- 【译】你应该了解的JavaScript数组方法
让我们来做一个大胆的声明:for循环通常是无用的,而且还导致代码难以理解.当涉及迭代数组.查找元素.或对其排序或者你想到的任何东西,都可能有一个你可以使用的数组方法. 然而,尽管这些方法很有用,但是其 ...
- es6 javascript对象方法Object.assign()
es6 javascript对象方法Object.assign() 2016年12月01日 16:42:34 阅读数:38583 1 基本用法 Object.assign方法用于对象的合并,将源对象 ...
- 简要谈谈javascript bind 方法
最近去参加了场面试,跟面试官聊了很多JS基础上的东西,其中有个问题是谈谈对apply.call.bind的理解和区别.顿时一愣,apply.call我知道,经常用的东西,bind是什么鬼!!!好像见过 ...
- javascript中几种this指向问题
javascript中几种this指向问题 首先必须要说的是,this 永远指向函数运行时所在的对象,而不是函数被创建时所在的对象. (1).作为函数名调用 函数作为全局对象调用,this指向 ...
- JavaScript 你真的了解this指向吗
JavaScript 你真的了解this指向吗 前言 终于开始写this指向了,相信这对很多JavaScript的学习者来说是一个非常恐怖的环节,个人认为也算是JavaScript中最难理解的一个知识 ...
- JavaScript中函数的this指向!
JavaScript的this的指向问题! 这是我自己敲的, 报错! <button>点击查看绑定事件的this指向!</button> <script> // 函 ...
- JavaScript中的this对象指向理解
在JavaScript中,this不是固定不变的,它的指向取决于上下文环境,一般的,认为this指向使用它时所在的对象.主要有以下几类指向: 在方法中,this 表示该方法所属的对象. 如果单独使用, ...
- JavaScript - reduce方法,reduceRight方法 (Array)
JavaScript - reduce方法 (Array) 解释:reduce() 方法接收一个函数作为累加器(accumulator),数组 中的每个值(从左到右)开始合并,最终为一个值. 语法:a ...
- JavaScript slice() 方法
JavaScript slice() 方法 JavaScript Array 对象 实例 在数组中读取元素: var fruits = ["Banana", "Oran ...
- JavaScript toLocaleString() 方法
JavaScript toLocaleString() 方法 JavaScript Array 对象 定义和用法 把数组转换为本地字符串. 语法 arrayObject.toLocaleString( ...
随机推荐
- PolarDB-X源码解读系列:DML之Insert流程
简介: Insert类的SQL语句的流程可初略分为:解析.校验.优化器.执行器.物理执行(GalaxyEngine执行).本文将以一条简单的Insert语句通过调试的方式进行解读. 在阅读本文之前,强 ...
- MySQL实战—更新过程
和查询流程不同的是,更新流程涉及两个重要的日志模块:redo log(重做日志)和 binlog(二进制日志). redo log redo log通常是物理日志,记录的是数据页的物理修改,而不是某一 ...
- 阿里云AHAS Chaos:应用及业务高可用提升工具平台之故障演练
简介: 阿里云AHAS Chaos:应用及业务高可用提升工具平台之故障演练 应用高可用服务AHAS及故障演练AHAS Chaos 应用高可用服务(Application High Availabili ...
- Serverless 架构模式及演进
简介: Serverless 架构从使用技术上有计算,数据存储,消息通信,我们可从运维性,安全性,可靠性,可扩展性,成本几个角度来衡量架构的优劣.本文会介绍一些常见的业务场景,探讨如何使用 Serv ...
- 5分钟搞定Loki告警多渠道接入
简介: Loki是受Prometheus启发的水平可扩展.高可用.多租户日志聚合系统.用户既可以将Loki告警直接接入SLS开放告警,也可以先将Loki接入Grafana或Alert Manager ...
- [FAQ] 部署二进制运行时 go-ego/gse 如何正确加载分词字典
运行Golang编译后二进制运行时,此时运行二进制时所在目录就是Golang源码程序认为的根目录了. 所以只需要把字典文件拷贝到与二进制所在同一目录内,然后使用 seg.LoadDict('dicti ...
- C语言结构体的内存分配
一.结构体内存分配原则 原则一:结构体中元素按照定义顺序存放到内存中,但并不是紧密排列.从结构体存储的首地址开始 ,每一个元素存入内存中时,它都会认为内存是以自己的宽度来划分空间的,因此元素存放的位置 ...
- VSCode+VUE+ESLint以达到保存自动格式化
首先打开VSCode在.eslintrc.js中加入以下代码(不知道怎么找可以ctrl+shift+p进行搜索),添加 vscode 终端启动服务 // 添加⾃定义规则 'prettier/prett ...
- 以对象的方式访问html中的标签,比正则表达式更好用的方式获取html中的内容,linq方式直接获取所有的链接,更加先进的c#版本爬虫开源库
这是我本人自己写的一个开源库,现已经发布到nuget,可以直接在vs的nuget包管理中搜索到,或者可以到nuget官网下载:https://www.nuget.org/packages/ZmjCon ...
- 解决:Failed to get D-Bus connection: Operation not permitted
docker中安装完httpd服务后,使用命令systemctl start httpd.service,发现报错,错误信息:Failed to get D-Bus connection: Opera ...