• 字面量对象遇到自执行函数


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

    直接上代码:

    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开始的,就必须在上一行结束的时候加上分号,避免导致上述问题。

  • 相关阅读:
    POJ 3672 水题......
    POJ 3279 枚举?
    STL
    241. Different Ways to Add Parentheses
    282. Expression Add Operators
    169. Majority Element
    Weekly Contest 121
    927. Three Equal Parts
    910. Smallest Range II
    921. Minimum Add to Make Parentheses Valid
  • 原文地址:https://www.cnblogs.com/zhuhuoxingguang/p/6245750.html
Copyright © 2020-2023  润新知