0.讲在前面
从这篇开始,我开始讲解BABEL官网提供的Learn ES2015文章,由于原文较长,我每一节整理成一篇文章。有感兴趣的小伙伴,一定要去原文看看。
1.ECMAScript 2015
ECMAScript 2015 is an ECMAScript standard that was ratified in June 2015.
就像上面这句话说得那样,2015年6月份批准的标准。什么标准呢?ECMAScript 2015 !啥是ECMAScript?ECMAScript是一种由ECMA国际在标准ECMA-262中定义的脚本语言规范。大家了解到这个程度就够了,我们大部分人都到不了参与协议制定流程的能力。其实在国际上,对于这个协议赞誉很多,从下面这些图中我们就能感受到编程高手们的激动之情:
规范是规范,哪个脚本语言实现了这个规范?JS实现了。好,那么我们下面开始领略新版JS的风采。
2.Arrows and Lexical This
怕产生歧义,我这里用的原标题。翻译过来,题目就是箭头函数和箭头函数内的this关键词。箭头函数大家基本已经用烂了,应该就算自己没写过,也见别人写过,原文重点只有两句话:
Unlike functions, arrows share the same lexical this as their surrounding code. If an arrow is inside another function, it shares the “arguments” variable of its parent function.
简言之,就是箭头函数内的this和它周围代码的this一样,他也可以使用它父函数的参数。下面看四个例子来感受其应用:
2.1.Expression bodies
var odds = evens.map(v => v + 1);
var nums = evens.map((v, i) => v + i);
其实好多人感受不到这种好处,我是个Javaer,我从JDK8才开始了解“函数是一等公民”的概念。给我的感受就是像之前C时代的函数指针,但是更加安全。这种方式的好处就在于,我们开始能把存储逻辑的变量传来传去,而不只是存储数据的变量。箭头函数可以简写逻辑,这里给出了表达式方式,也就是单行怎么写。
2.2.Statement bodies
nums.forEach(v => {
if (v % 5 === 0)
fives.push(v);
});
这里给出了多行怎么写,很简洁啊,不赘述。
2.3.Lexical this
var bob = {
_name: "Bob",
_friends: ["老张", "老王", "老亓[qí]", "老呼延", "老逯[lù]"],
printFriends() {
this._friends.forEach(f =>
console.log(this._name + " knows " + f));
}
};
bob.printFriends();
这个脚本,我们运行一下,结果是:
Bob knows 老张
Bob knows 老王
Bob knows 老亓[qí]
Bob knows 老呼延
Bob knows 老逯[lù]
这你就懂了,哦,这箭头函数里面的this它和外边的一样。
2.4.Lexical arguments
function square() {
let example = () => {
let numbers = [];
for (let number of arguments) {
numbers.push(number * number);
}
return numbers;
};
return example();
}
square(2, 4, 7.5, 8, 11.5, 21);
运行一下,效果是:
[4, 16, 56.25, 64, 132.25, 441]
这里多说两句,提到了不常见的arguments
,因为表述不太清楚,我确实也看到的少,在w3school的JavaScript Function Parameters有解释:
Function parameters are the names listed in the function definition.
Function arguments are the real values passed to (and received by) the function.
我看到使用它的人不多,当然也可能是我见识短浅,这位朋友:JavaScript arguments 对象全面介绍
写过自己整理的文章。若是传递多个参数的话,倒是常见到下面这样的句子:
export declare function warn(msg: string, ...args: any[]): void;
不展开了,怕跑题。好了,这就是咱们第一节的讲述。