您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>源码下载>java源码下载>

javascript 函数声明的优势分析

大小:1.98 MB 人气: 2017-09-30 需要积分:1

  我对箭头函数绝对是真爱,但要声明一个顶级函数时,我仍用“土气”的函数声明。

  为什么呢?“Uncle Bob” Martin 是这么说的:

  花1小时写代码,就要花10小时检查代码。查找漏洞都成了写代码的一部分了,这个差距太悬殊。就算写代码多费点时间,代码也要简单易懂。—— Robert C. Martin《Clean Code: A Handbook of Agile Software Craftsmanship》

  相比函数表达式,函数声明有两大优势:

  1

  目的明了

  每天看上千行代码,快速了解程序员的目的非常重要。

  看看这行代码:

  const maxNumberOfItemsInCart = 。。.;

  读完了还是不知道这省略符号是函数还是其他什么值。它可能是:

  const maxNumberOfItemsInCart = 100;

  也可能是:

  const maxNumberOfItemsInCart = (statusPoints) =》 statusPoints * 10;

  如果使用函数声明就没有这个麻烦了。

  请看:

  const maxNumberOfItemsInCart = 100;

  对比:

  function maxNumberOfItemsInCart(statusPoints) {

  return statusPoints * 10;

  }

  从一开始目的就很明了。

  不过,如果你的代码编辑器可以用颜色区分代码,或者你在用一个 Speed Reader,就当我什么都没说。

  你们肯定在暗自赞叹函数声明既简洁又迷人吧。

  实际上,仅这一个原因还不足以服人,还有另外一个原因。

  2

  Order of declaration == order of execution

  执行顺序和声明顺序一致时,是最理想的。如果能做到执行时才声明使用 const(常数)关键字的值就很厉害了。

  

  都退后,我要开始装逼了

  Fair warning:接下来我要放大招了——下文“行话”连篇,但你只要明白在声明之前不能使用常数就好。

  以下的代码会抛出一个错误:

  sayHelloTo(‘Bill’);

  const sayHelloTo = (name) =》 `Hello ${name}`;

  这是因为,当 Java 引擎阅读代码时,会绑定(bind)而非初始化sayHelloTo。

  Java 中所有声明都是提升(hoist)和绑定的,但初始化的方式各自不同。换言之,Java 提升了sayHelloTo的声明——先阅读,再置其于顶层,然后创建空间来储存其值——但在执行之前不会声明sayHelloTo。

  sayHelloTo绑定和初始化的时间差叫作“暂存死区(TDZ)”。

  如果在浏览器里直接使用ES2015(而不是借助Babel等使用ES5),以下的代码也会抛出错误:

  if(thing) {

  console.log(thing);

  }

  const thing = ‘awesome thing’;

  以上的代码是用var而非const写的,不会抛出错误,因为变量被绑定时会初始化为undefined,而常数被绑定时完全不会被初始化。有点偏题了……

  函数声明不会有此类 TDZ 问题。如下文,代码可以是:

  sayHelloTo(‘Bill’);

  function sayHelloTo(name) {

  return `Hello ${name}`;

  }

  这是因为函数声明在被绑定时就被初始化了——这是在执行代码之前。

  所以不论何时进行函数声明,代码开始执行时,语法都是符合其作用域的。

非常好我支持^.^

(0) 0%

不好我反对

(0) 0%

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!