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再使用。

原文地址:https://www.cnblogs.com/chianquan/p/10257723.html

时间: 2024-08-28 21:52:55

typescript 属性默认值使用箭头函数 this指向问题的相关文章

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

问题来源于 React.component的第二个参数的类型定义问题,我构建了以下简化demo,方便描述问题: class P<STATE> { public state: STATE; } interface Obj { arr: Obj[]; } class Test1 extends P<Obj> { public state = {arr: []}; func(obj: Obj) { this.state.arr.push(obj);// 这里ts在obj上抛错 Error

ES6 中箭头函数 this 指向问题

在上一讲当中,我们知道了es5 中函数的 this 指向问题,即:指向直接调用它的那个对象.那么,在es6 中,箭头函数中的 this 指向是不是会有所不同呢?答案是必然的,今天我们就来聊聊箭头函数的this指向~ 首先来简单对比一下: [es5普通函数] // es5: var str = 'window' var obj = { str: 'obj', fn: function () { console.log(this.str) } } obj.fn() // obj [es6箭头函数]

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

ES6新特性之 函数参数的默认值写法 和 箭头函数. 1.函数参数的默认值 ES5中不能直接为函数的参数指定默认值,只能通过以下的变通方式:   从上面的代码可以看出存在一个问题,当传入的参数为0或者false时,会直接取到后面的值,而不是传入的这个参数值. 那怎么解决呢?对于上图的代码,可以通过判断是否传入了num参数,没有就用默认值:   这种做法还是很麻烦的,而ES6则直接在参数定义里面设置函数参数的默认值,而且不用担心传入参数是0或者false会出错了: 2.箭头函数 箭头函数用 =>

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

零.引言 PropertyGrid显示一个对象的属性和事件时,可以设置其默认属性和事件,也就是当你选中对象时,propertyGrid中焦点在哪一个属性或事件上.为对象的属性提供默认值,使PropertyGrid显示属性时,更加友好. 一.默认属性和默认事件 PropertyGrid能识别默认属性和事件,例如在设计时,双击Form框,就会跳到Form的Load事件中,这是因为Form的默认事件是Load.当你选中属性框中的某一项后,该项会着色(蓝色)选中,在属性和事件选项卡之间切换,就会发现,选

类属性默认值

类里定义的数据成员称为属性,属性可不赋初值,若不赋初值则JAVA会按上表为其添加默认值:方法里定义的数据成员称为变量,变量在参与运算之前必须赋初值. 数据类型                                    默认值boolean                                    falsechar                                           '/u0000'整形(byte,short,int,long)      

react中属性默认值是true?

看到项目代码中 return ( <MyWebView state="Login" title="登录app" ref="login" rightComponent url={url} onMessage={this.onMessage} {...this.props} /> ) 里面的rightComponent没有声明值,在父组件中是当成一个布尔值用的,那该值是true还是false?找了下资料,说若没有值,而且没有提供默认值,则

MySQL中默认值中用时间函数的问题

今天在上课的时候在测试MSSQL建表的时候 注册时间默认值用getdate()可以获取插入值时候的时间create table temp( id int PRIMARY key, in_time datetime NOT NULL default getdate() ) 但是在MYSQL建表练习的时候不能用now()进行对应的做法: create table temp(    id int PRIMARY key,    in_time datetime NOT NULL default now

ES6箭头函数this指向

普通函数中的this: 1. this总是代表它的直接调用者(js的this是执行上下文), 例如 obj.func ,那么func中的this就是obj 2.在默认情况(非严格模式下,未使用 'use strict'),没找到直接调用者,则this指的是 window (约定俗成) 3.在严格模式下,没有直接调用者的函数中的this是 undefined 4.使用call,apply,bind(ES5新增)绑定的,this指的是 绑定的对象 箭头函数中的this 箭头函数没有自己的this,

js this 指向(es5)和es6箭头函数this指向问题总结(邹文丰版)

本文纯属自己结合网上文章总结,有问题和不同想法欢迎留言指正/********************简单小例子********************/ var test =function () { console.log(this); }; // test(); //window/*****************************2***********************************/ var test2 =function () { console.log(thi