zoukankan      html  css  js  c++  java
  • 字面量对象遇到自执行函数

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

    直接上代码:

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

  • 相关阅读:
    vue-nuxtjs
    mongodb4.0支持事务
    promisify,promisifyAll,promise.all实现原理
    nodejs, 阿里oss上传下载图片
    数据库备份与还原
    SQL 数据类型、约束、索引及视图
    数据库的查询
    数据库(增、删、改、查)
    数据库基础知识
    C#语言小结
  • 原文地址:https://www.cnblogs.com/zhuhuoxingguang/p/6245750.html
Copyright © 2011-2022 走看看