今天在测试一个函数内部利用函数名调用自身时,想到一个问题,如果一个对象具有相同的名称,并且刚好在函数执行之前的作用域,就想知道,在函数内部调用该名称时,优先级是什么样的,可是还没测出来这个问题时,却遇到了一个奇怪的问题。

直接上代码:

var bar = {
  count : 0
}
     
(function foo() {
  foo.count = 4;
  console.log(foo)
})();

  不知道有多少人会写到类似的代码,一个字面量的对象,后面跟上一个自执行函数,从个人角度而言,仅仅看这段代码,不会觉得有任何的问题,可是在浏览器中执行该代码的时候,报错了,居然报错了。。。

  我就想知道,你为什么报错,你凭什么报错?

  报错提示的是中间值不是一个函数,意思是说,第一个括号内的函数不是一个表达式,他没办法立即执行。

  这就懵逼了,从一脸懵逼到各种懵逼,反正不知道哪里的问题。然后瞎捣鼓一通,发现加个分号就搞定了。 

var bar = {
  count : 0
};
     
(function foo() {
  foo.count = 4;
  console.log(foo)
})();

  就这么个分号搞定了,我就想知道这是为什么呢?

  《编写可维护的javascript》第7页讲到“语句结尾”的时候,很明确的说明了分析器具有自动分号(Automatic Semicolon Insertion, ASI)插入机制,JavaScript代码省略分号也是可以正常工作的。

  一直以来,也是知道在哪里避免这种分号结尾可能导致的问题。但是完全看不明白这个分号的问题是什么?求解!

  ——————————————————————————————————————————————————————————————

  在知乎上看到了答案,https://www.zhihu.com/question/20298345,@尤雨溪 所回答,“真正会导致上下行解析出问题的 token 有 5 个:括号,方括号,正则开头的斜杠”,所以说如果行首以这5个token开始的,就必须在上一行结束的时候加上分号,避免导致上述问题。

 

posted on 2017-01-03 17:45  烛火星光  阅读(260)  评论(0编辑  收藏  举报