typescript 属性默认值使用箭头函数 this指向问题
今天注意到前端小伙伴用react 定义component class的方法的时候是通过箭头函数的方式,表示好奇。
class Test extends React.Component {
public fun1 = () => {
console.log(this);
}; fun2() {
console.log(this);
}
}
如上代码中fun1的定义方式。于是感到好奇,fun1中的this是什么。
如果我们套用箭头函数的概念,我们可能认为,这中间的this是否会指向环境变量global或window。然而却不是这样的,而是指向new Test()实例。
我们可以看以下的等价写法:
class Test extends React.Component {
constructor() {
super();
this.fun1 = () => {
console.log(this);
};
} fun2() {
console.log(this);
}
}
也就是在属性默认值中定义的箭头函数,等价于构造函数中的定义,所有this指向的是实例。
那么为何要用定义箭头函数属性的方式来定义方法呢?
它和fun2的方式的this指向的不是都是实例吗?
const obj = new Test();
obj.fun1();// 指向obj
obj.fun2();// 指向obj //差异
const fun1=obj.fun1;
const fun2=obj.fun2; fun1();// 指向obj
fun2();// global
如上代码,我们如果直接用实例来调用,则没什么差异。
但是,当我们先赋值给变量,由于fun2是绑定调用者的,所以这里为全局变量。
所以直接定义箭头函数属性的效果在于它直接绑定了实例,可以直接使用,这个对应react的jsx中使用是比较方便的,不然使用fun2模式,就需要手动绑定this再使用。
typescript 属性默认值使用箭头函数 this指向问题的更多相关文章
- typescript 关于class属性类型定义被属性默认值覆盖的问题及解决方式
问题来源于 React.component的第二个参数的类型定义问题,我构建了以下简化demo,方便描述问题: class P<STATE> { public state: STATE; ...
- HTML标签CSS属性默认值汇总
HTML标签CSS属性默认值,在你需要还原默认值的时候比较有用. 以前一直在找这份文档,今天偶然在网上看到了.除了inline和block的定义,主要是要注意body|h1~h6|blockquote ...
- ES6 箭头函数 this 指向
ES6 箭头函数 this 指向 箭头函数有几个使用注意点: 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象. 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个 ...
- ES6 箭头函数this指向问题
var name = "window"; var person1 = { name: "person1", show1: function() { consol ...
- 箭头函数this指向问题
this指向本质 箭头函数this指向的固定化,并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this,导致内部的this就是外层代码块的this.正是因为它没有this ...
- ES6新特性(函数默认参数,箭头函数)
ES6新特性之 函数参数的默认值写法 和 箭头函数. 1.函数参数的默认值 ES5中不能直接为函数的参数指定默认值,只能通过以下的变通方式: 从上面的代码可以看出存在一个问题,当传入的参数为0或者 ...
- PropertyGrid—默认属性,默认事件,属性默认值
零.引言 PropertyGrid显示一个对象的属性和事件时,可以设置其默认属性和事件,也就是当你选中对象时,propertyGrid中焦点在哪一个属性或事件上.为对象的属性提供默认值,使Proper ...
- SQL 语句修改列名 属性 默认值
--修改字段名exec sp_rename '表名.列名','新列名' --修改字段属性alter table 表名 alter column 列名 nvarchar(100) null; --修改默 ...
- C#属性默认值设置
关于在MVC中view中设置默认值,可以象如下设置: 1.关于VIEWMODEL的部分 如果是C# 6.0,网上资料查到说可以 如果语法不支持,只能改回.net 2.0的写法. public cla ...
随机推荐
- RocketMq 集群搭建 部署
原文链接:https://blog.csdn.net/weixin_40533111/article/details/84451219 作者小太阳^_^,转载请注明出处,谢谢 前言本文基于最新版roc ...
- Java解析XML文件的常用方法介绍
XML是一个可扩展标记语言.很多时候我们需要进行数据交换,同时也存在跨平台使用,XML文件对这些需求提供了很好的帮助! 对于Java来说,XML常见的用途就是保存数据和配置,这就涉及了对XML文件的增 ...
- laravel——基础增删改查
一.控制器代码 <?php namespace App\Http\Controllers; use Illuminate\Support\Facades\DB; class CurdContro ...
- laravel——ajax分页&删除&搜索
一.视图代码 /*搜索*/<form action="javascript:search_brand()" name="searchForm"> & ...
- CentOS6.9切换root用户su root输入正确密码后一直提示Incorrect password,如何解决?
su是切换用户命令,su root时,输入正确的root命令,却提示Incorrect password,当前用户为普通用户,遇到此问题该如何解决呢? 如果设置了wheel组,使用su root命令是 ...
- 【笔记】Nginx热更新相关知识
(以下学习笔记内容均摘自参考链接,仅供个人查阅) 1.inotify文件系统监控特性 Inotify 是一个 Linux 内核特性,它监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如 ...
- RabbitMQ跟Redis做消息队列的区别
区别 https://www.zhihu.com/question/20795043 https://blog.csdn.net/dd18709200301/article/details/79077 ...
- js二分查找算法
二分查找高效的前提是数据结构是有序的.就好比猜1~100之间的数,先猜50,如果太大了就猜25,如果太小了就猜75.每一次都猜最大值和最小值的中间点. 1.随机生成100个0~100之间的随机数. v ...
- 射频(SX1278)
射频是什么? 官方说法:RF,Radio Frequency. (不懂的人,看了还是不懂,不过对于物联网行业的开发工程师.产品经理和项目经理,还是有需要对射频有个基础了解的.) 燚智能解读: 两个人, ...
- LeetCode--027--移除元素(java)
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...