在ES6中,类中定义的方法,是放在原型对象的,供实例对象引用。

//创建一个Person类
class Person {
constructor(name,age) {
this.name = name;
this.age = age;
}
}
class Student extends Person {
constructor(name,age,grade) {
super(name,age);
this.grade = grade;
}
study() {
console.log(this);
}
}
const st = new Student("john", 12, 'sdfjk');
st.study();
const x = st.study;
x();

所以,在st调用study方法时候,输出的是该实例对象,而将st.study方法赋值给x时,再调用x,那么类中定义的方法都是局部严格模式,所以该方法中的this就是undefined。

而将代码改为:

const st = new Student("john", 12, 'sdfjk');
st.study();
const x = st.study.bind({name:'Tom',age:18});
x();

此时,x中的this就是对象{name:"Tom",age:18}了,输出如下:

下面上jsx代码:

class Weather extends React.Component{
constructor(props){
super(props);
this.state={isHot:false};
}
render(){
return <h1 onClick={this.changeWheather}>今天天气很炎热</h1>
}
changeWheather(){
console.log(this);
}
}
ReactDOM.render(<Weather/>,document.getElementById("test"));

点击,发现changeWheather打印的是undefined。

是因为changeWheather是作为onCick的回调,而部是通过实例调用的,是直接调用类中的方法,默认开启了局部的严格模式,当点击时,调用changeWheather方法,而该方法并不是实例调用的,开启严格模式,所以this就是undefined,所以打印的是undefined

而改正的方法,就是通过bind,将类中定义的changeWheather方法中的this改为实例对象。

        class Weather extends React.Component{
constructor(props){
super(props);
this.state={isHot:false};
this.test=this.nice.bind(this);
}
render(){
return <h1 onClick={this.test}>今天天气很炎热</h1>
}
nice(){
console.log(this);
}
}
ReactDOM.render(<Weather/>,document.getElementById("test"));

上述修改,当点击时,触发test方法,虽然同样也不是实例对象调用的,但test方法中的this就是实例对象,因为在constructor构造器中,已经通过bind,将nice方法中的this变成了实例对象,所以,输出的是实例对象

上述修改只是为了,更明显的说明,实际上可以:

class Weather extends React.Component{
constructor(props){
super(props);
this.state={isHot:false};
this.changeWheather=this.changeWheather.bind(this);
}
render(){
return <h1 onClick={this.changeWheather}>今天天气很炎热</h1>
}
changeWheather(){
console.log(this);
}
}
ReactDOM.render(<Weather/>,document.getElementById("test"));

可以看到,实例中也有一个changeWheather方法,这里,在赋值给回调函数时候,首先发现了实例的changeWheateher,所以就不会调用原型对象上的changeWheather方法。

精简写法

class Weather extends React.Component{
//可以去掉构造器
//直接用赋值语句,给实例增加属性。
state={isHot:false};
render(){
const isHot=this.state.isHot;
return <h1 onClick={this.changeWheather}>今天天气很{isHot?"炎热":"凉爽"}</h1>
}
//自定义方法,要用赋值语句的形式+箭头函数,箭头函数中的this,就会往外寻找this,而由于是赋值语句
//所以该属性是放在实例上的,而又因为是箭头函数,所以this,外寻,找到了实例,所以,此处里面的this就是实例。
changeWheather=()=>{
const isHot=this.state.isHot;
this.setState({isHot:!isHot});
}
}
ReactDOM.render(<Weather/>,document.getElementById("test"));

关于类中赋值语句+箭头函数的this指向的测试如下:

#React中类组件中关于回调函数的一个问题的更多相关文章

  1. 理解和使用 JavaScript 中的回调函数

    理解和使用 JavaScript 中的回调函数 标签: 回调函数指针js 2014-11-25 01:20 11506人阅读 评论(4) 收藏 举报  分类: JavaScript(4)    目录( ...

  2. 理解javascript中的回调函数(callback)【转】

    在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...

  3. JavaScript 中的回调函数

    原文:http://javascriptissexy.com/ 翻译:http://blog.csdn.net/luoweifu/article/details/41466537 [建议阅读原文,以下 ...

  4. react 在 componentWillMount() 中调用异步函数时,componentWillMount() finishes after render()

    刚开始使用 react,很多属性.方法不是很熟.在此记录下我所遇到的问题及解决方法. 我在 componentWillMount() 中调用了一个异步函数,在返回结果中调用 this.setState ...

  5. PHP中的回调函数和匿名函数

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  6. js中的回调函数的理解和使用方法

    js中的回调函数的理解和使用方法 一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为 ...

  7. [转]理解与使用Javascript中的回调函数

    在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...

  8. 【JavaScript】理解与使用Javascript中的回调函数

    在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...

  9. C中的回调函数

    C语言中应用回调函数的地方非常多,如Nginx中: struct ngx_command_s { ngx_str_t name; ngx_uint_t type; char *(*set)(ngx_c ...

  10. Java中的回调函数学习

    Java中的回调函数学习 博客分类: J2SE JavaJ#  一般来说分为以下几步: 声明回调函数的统一接口interface A,包含方法callback(); 在调用类caller内将该接口设置 ...

随机推荐

  1. 《基于NLP内容理解》出书

    <基于NLP内容理解>出书初心: 1)情怀&梦想:记得自己高中的时候每次冲进我们县城的书店,都能看到书店中央摆放着白岩松老师的一本自传,当时的那种崇拜一直萦绕在自己的心里,想着自己 ...

  2. 傻妞PLUS机器人教程——安装

    特性 简单易用的消息搬运功能. 简单强大的自定义回复功能. 完整支持 ECMAScript 5.1 的插件系统,基于 otto. 支持通过内置的阉割版 Express / fetch ,接入互联网. ...

  3. MySQL - [20] 事务

    题记部分 一.什么是ACID (1)Atomicity 原子性 某个操作,要么全部执行完毕,要么全部回滚. (2)Consistency 一致性 数据库中的数据全都符合现实世界中的约束,则这些数据就符 ...

  4. Python - [03] 基础语法

    题记部分 一.标识符 第一个字符必须是字母表中字母或下划线_ 标识符的其他部分由字母.数字和下划线组成 标识符对大小写敏感 二.Python保留字 三.注释 (1)单行注释:以#开头 #!/usr/b ...

  5. cmd - windows操作系统命令提示符常用命令

    mklink /j C:\Users\lin_0421\Desktop\note D:\note

  6. 重生之数据结构与算法----数组&链表

    简介 数据结构的本质,只有两种结构,数组与链表.其它的都是它的衍生与组合 算法的本质就是穷举. 数组 数组可以分为两大类,静态数组与动态数组. 静态数组的本质是一段连续的内存,因为是连续的,所以我们可 ...

  7. 【 Python 】补全fibersim 导出的xml语法

    fibersim导出的xml文件中,node 和mesh部分的标签会缺失.即<R></R>变成了<R/>. 以下python脚本可以自动修正 # ********* ...

  8. 【记录】C/C++-关于I/O的坑与教训

    吐槽 每每读取字符串时,倘若稍有灵活的操作,总会遇上诡异奇怪的事情.究其原因,就是没完全理解一些基本读写函数的机制.这次做Uva227就把I/O上的问题全暴露出来了.想来还是应该记录一些经验教训. 记 ...

  9. FastAPI 自定义参数验证器完全指南:从基础到高级实战

    title: FastAPI 自定义参数验证器完全指南:从基础到高级实战 date: 2025/3/11 updated: 2025/3/11 author: cmdragon excerpt: 本教 ...

  10. Web前端入门第 10 问:HTML 段落标签( <p> )嵌套段落标签( <p> )的渲染结果会怎样?

    HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 曾经有一个神奇的 bug 摆在我面前,为什么套娃一样的 HTML 语法,在段落标签 <p> 身上不生 ...