你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

学习ECMAScript 2015【1】Arrows and Lexical This

2021/11/4 5:47:39

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;

不展开了,怕跑题。好了,这就是咱们第一节的讲述。

image.png