今天注意到前端小伙伴用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指向问题的更多相关文章

  1. typescript 关于class属性类型定义被属性默认值覆盖的问题及解决方式

    问题来源于 React.component的第二个参数的类型定义问题,我构建了以下简化demo,方便描述问题: class P<STATE> { public state: STATE; ...

  2. HTML标签CSS属性默认值汇总

    HTML标签CSS属性默认值,在你需要还原默认值的时候比较有用. 以前一直在找这份文档,今天偶然在网上看到了.除了inline和block的定义,主要是要注意body|h1~h6|blockquote ...

  3. ES6 箭头函数 this 指向

    ES6 箭头函数 this 指向 箭头函数有几个使用注意点: 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象. 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个 ...

  4. ES6 箭头函数this指向问题

    var name = "window"; var person1 = { name: "person1", show1: function() { consol ...

  5. 箭头函数this指向问题

    this指向本质 箭头函数this指向的固定化,并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this,导致内部的this就是外层代码块的this.正是因为它没有this ...

  6. ES6新特性(函数默认参数,箭头函数)

    ES6新特性之 函数参数的默认值写法 和 箭头函数. 1.函数参数的默认值 ES5中不能直接为函数的参数指定默认值,只能通过以下的变通方式:   从上面的代码可以看出存在一个问题,当传入的参数为0或者 ...

  7. PropertyGrid—默认属性,默认事件,属性默认值

    零.引言 PropertyGrid显示一个对象的属性和事件时,可以设置其默认属性和事件,也就是当你选中对象时,propertyGrid中焦点在哪一个属性或事件上.为对象的属性提供默认值,使Proper ...

  8. SQL 语句修改列名 属性 默认值

    --修改字段名exec sp_rename '表名.列名','新列名' --修改字段属性alter table 表名 alter column 列名 nvarchar(100) null; --修改默 ...

  9. C#属性默认值设置

    关于在MVC中view中设置默认值,可以象如下设置: 1.关于VIEWMODEL的部分 如果是C#  6.0,网上资料查到说可以 如果语法不支持,只能改回.net 2.0的写法. public cla ...

随机推荐

  1. RocketMq 集群搭建 部署

    原文链接:https://blog.csdn.net/weixin_40533111/article/details/84451219 作者小太阳^_^,转载请注明出处,谢谢 前言本文基于最新版roc ...

  2. Java解析XML文件的常用方法介绍

    XML是一个可扩展标记语言.很多时候我们需要进行数据交换,同时也存在跨平台使用,XML文件对这些需求提供了很好的帮助! 对于Java来说,XML常见的用途就是保存数据和配置,这就涉及了对XML文件的增 ...

  3. laravel——基础增删改查

    一.控制器代码 <?php namespace App\Http\Controllers; use Illuminate\Support\Facades\DB; class CurdContro ...

  4. laravel——ajax分页&删除&搜索

    一.视图代码 /*搜索*/<form action="javascript:search_brand()" name="searchForm"> & ...

  5. CentOS6.9切换root用户su root输入正确密码后一直提示Incorrect password,如何解决?

    su是切换用户命令,su root时,输入正确的root命令,却提示Incorrect password,当前用户为普通用户,遇到此问题该如何解决呢? 如果设置了wheel组,使用su root命令是 ...

  6. 【笔记】Nginx热更新相关知识

    (以下学习笔记内容均摘自参考链接,仅供个人查阅)   1.inotify文件系统监控特性 Inotify 是一个 Linux 内核特性,它监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如 ...

  7. RabbitMQ跟Redis做消息队列的区别

    区别 https://www.zhihu.com/question/20795043 https://blog.csdn.net/dd18709200301/article/details/79077 ...

  8. js二分查找算法

    二分查找高效的前提是数据结构是有序的.就好比猜1~100之间的数,先猜50,如果太大了就猜25,如果太小了就猜75.每一次都猜最大值和最小值的中间点. 1.随机生成100个0~100之间的随机数. v ...

  9. 射频(SX1278)

    射频是什么? 官方说法:RF,Radio Frequency. (不懂的人,看了还是不懂,不过对于物联网行业的开发工程师.产品经理和项目经理,还是有需要对射频有个基础了解的.) 燚智能解读: 两个人, ...

  10. LeetCode--027--移除元素(java)

    给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...