今天在测试一个函数内部利用函数名调用自身时,想到一个问题,如果一个对象具有相同的名称,并且刚好在函数执行之前的作用域,就想知道,在函数内部调用该名称时,优先级是什么样的,可是还没测出来这个问题时,却遇到了一个奇怪的问题。
直接上代码:
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代码省略分号也是可以正常工作的。
一直以来,也是知道在哪里避免这种分号结尾可能导致的问题。但是完全看不明白这个分号的问题是什么?求解!
原文:http://www.cnblogs.com/zhuhuoxingguang/p/6245750.html