ES6与React中this完全解惑
计划写很长的篇幅,预计12月初完成。
这篇文章涉及的知识较多,可能一次消化不了,可以渐渐来。
先说结论:
无论是ES6还是React的this,相对于ES5,只是增加了箭头函数this绑定了其封闭上下文,自己实现了该词法,其它的关于this的与ES5仍然一样。
目录:
1.ES5中对this使用的4种方式
2.ES6中箭头函数中的this
3.ES6中class中的this
4.React中组件里的this 组件里事件函数,其实相当于把对象方法赋值给新变量后再调用,这和ES5中是一样的,变成了函数调用,this指向全局。
要理解ES6的this知识,首先必须非常熟悉ES5里this的知识,要不然还是会一头雾水。
1.ES5中对this使用的4种方式
待补充
2.ES6中箭头函数中的this
先看几个例子
function foo() {
setTimeout(() => {
console.log('id:', this.id);
}, 100);
}
var id = 21;
foo.call({ id: 42 });
// id: 42
上面这个例子是阮一峰ES6入门里的一个例子,他在书中提到“箭头函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象”,这种解释并不好,你也行还是不能真正理解上面这个例子。我更推荐MDN里对箭头函数this的说明“箭头功能不会创建自己的this;它使用封闭执行上下文的this值”。setTimeout里的函数的封闭上下文是foo函数,因此该箭头函数使用foo函数的this,在调用的时候,foo函数通过call将自己的id变成42,所以打印出的this.id是42。
下面的例子是MDN的例子,会从0每隔一秒打印递增的整数0,1,2,3... 。对照这个例子再体会MDN对于箭头函数的说明。
function Person(){
this.age = 0;
setInterval(() => {
console.log(this.age++) // 传递给setInterval的函数内的this与封闭函数中的this值相同
}, 1000);
}
var p = new Person();
还有一点,有些同学可能因为之前看了阮一峰对箭头函数this的解释“箭头函数体内的this对象,就是定义时所在的对象”,会产生疑惑,它每次使用的是这个对象的起初的深拷贝的副本还是引用值,通俗的问就是,当执行上下文的this值上的属性变化了,箭头函数里的this上的属性是否变化呢。答案是也跟着变化,我们根据MDN的解释,它使用封闭执行上下文的this值。上面的例子其实已经可以验证这个问题了,为了更清楚一下,我们稍微改一下。
function Person(){
this.age = 0;
setInterval(() => {
console.log(this.age++);
}, 1000);
}
var p = new Person();
p.age = 50;
我们在控制台可以看到,从50每隔1秒递增打印一个整数。
由于 this 已经在词法层面完成了绑定,通过 call() 或 apply() 方法调用一个箭头函数时,只是传入了参数而已,对 this 并没有什么影响:
var adder = {
base : 1,
add : function(a) {
var f = v => v + this.base;
return f(a);
},
addThruCall: function(a) {
// console.log(this.base)
var f = v => v + this.base;
var b = {
base : 2
};
return f.call(b, a);
}
};
console.log(adder.add(1)); // 输出 2
console.log(adder.addThruCall(1)); // 仍然输出 2(而不是3)
注意与一开始的例子区别,一开始的例子是对箭头函数外层函数使用call,而这个例子是直接对箭头函数使用call。addThruCall内的this与ES5一样,是调用对象的this,里面的箭头函数同样使用这个this。我们在后面加两句
var cc = adder.addThruCall;
console.log(cc(1))
控制台输出NaN,想想是不是和ES5对象方法调用一样的呢。
参考链接:1.MDN箭头函数
ES6与React中this完全解惑的更多相关文章
- 理解React中es6方法创建组件的this
首发于:https://mingjiezhang.github.io/(转载请说明此出处). 在JavaScript中,this对象是运行时基于函数的执行环境(也就是上下文)绑定的. 从react中的 ...
- [ES6]react中使用es6语法
前言 不论是React还是React-native,facebook官方都推荐使用ES6的语法,没在项目中使用过的话,突然转换过来会遇到一些问题,如果还没有时间系统的学习下ES6那么注意一些常见的写法 ...
- React与ES6(四)ES6如何处理React mixins
React与ES6系列: React与ES6(一)开篇介绍 React和ES6(二)ES6的类和ES7的property initializer React与ES6(三)ES6类和方法绑定 React ...
- Immutable 详解及 React 中实践
本文转自:https://github.com/camsong/blog/issues/3 Shared mutable state is the root of all evil(共享的可变状态是万 ...
- React中使用CSSTransitionGroup插件实现轮播图
动画效果,是一个页面上必不可少的功能,学习一个新的东西,当然就要学习,如何用新的东西,用它的方法去实现以前的东西啦.今天呢,我就在这里介绍一个试用react-addons-css-transition ...
- react中,constructor和getInitialState的区别
1,ES6语法 使用class声明一个类,且要继承react组件的方法和属性的时候 : 在里面我们可以直接指定 this.state = { }, 我们可以当前组件内任何地方使用 this.setSt ...
- react中如何使用动画效果
在react中想要加入动画效果 需要引入 import {CSSTransitionGroup} from 'react-transition-group' //加入react 动画包 import ...
- react中这些细节你注意过没有?
react中的一些细节知识点: 1.组件中get的使用(作为类的getter) ES6知识:class类也有自己的getter和setter,写法如下: Class Component { const ...
- React 中的 Component、PureComponent、无状态组件 之间的比较
React 中的 Component.PureComponent.无状态组件之间的比较 table th:first-of-type { width: 150px; } 组件类型 说明 React.c ...
随机推荐
- 标准模板库 STL 使用之 —— vector 使用 tricks
1. 从已有 vector(或数组)中复制 vector<int> a{....}; int an = a.size(); int half = an/2; vector<int&g ...
- GO语言学习(六)Go 语言数据类型
在 Go 编程语言中,数据类型用于声明函数和变量. 数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存. Go 语言按类别有以下几种 ...
- OpenJDK源码研究笔记(十六):在Java中使用JavaScript脚本语言
友情提示 本文主要参考了51CTO上的一篇文章,代码经过自己的模仿和整理,还算凑合. 本文中的代码注释比较多,不再过多解释. 更多用法,还是得看JDK的API或者看原文http://developer ...
- ganglia错误解决
1. 运行: 解决: 这时重新启动gmetad,输入命令: service gmetad stop 显示: Shutting down GANGLIA gmetad: ...
- 步步为营(十五)搜索(一)DFS 深度优先搜索
前方大坑预警! 先讲讲什么是搜索吧. 有一天你去一个果园摘梨子,果农告诉你.有一棵树上有一个金子做的梨子,找到就是你的,你该怎么找? 地图例如以下: S 0 0 0 0 0 0 0 0 0 0 0 0 ...
- Android Studio查看android源码
Android Studio的默认版本在/Applications/Android Studio.app/Contents/info.plist中设置,默认没有1.8.如下: <key>J ...
- VS无法访问IIS元数据库 您没有足够的特权访问计算机上的IIS网站
进入windows\regedit.exe下的HKEY_CRRENT_USER\Software\Microsoft\Windows\CurrentVersion\Exploer\User Shell ...
- UVA 11732 - strcmp() Anyone? 字典树
传送门:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- svn 清理失败 (clean up 失败) 的解决方法
解决方法: step1: 到 sqlite官网 (http://www.sqlite.org/download.html) 下载 sqlite3.exe 找到 Precompiled Binaries ...
- IWorkSpace与IWorkSpaceFactory与IWorkSpaceEdit
樱木 原文 IWorkSpace与IWorkSpaceFactory与IWorkSpaceEdit 1.IWorkSpace是一个容器,里面存放着各种空间数据和非空间数据,比如Featureclass ...