CNode

少了个分号,(function () { /* ... */ }(); 竟然报错

Lleizongmin发布于14 年前最后回复13 年前8 回复9212 浏览0 收藏

刚才发现了一个很奇怪的问题: 在定义带花括号的变量时(比如function () {} 或者对象{}),其后面跟一个这样的匿名函数竟然会报错:

var a = {}
(function () {
  console.log('OK');
})();

出错信息:

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
TypeError: object is not a function
    at Object.CALL_NON_FUNCTION (native)
    at Object.<anonymous> (f:\github\Liquid.js\test\b.js:2:10)
    at Module._compile (module.js:441:26)
    at Object..js (module.js:459:10)
    at Module.load (module.js:348:31)
    at Function._load (module.js:308:12)
    at Array.0 (module.js:479:10)
    at EventEmitter._tickCallback (node.js:192:40)

加了个分号就正常了:

var a = {};
(function () {
  console.log('OK');
})();

求大神们解释

查看回复

回复 (8)

F
fyddaben#1·13 年前

学习了

Y
yaochun#2·13 年前

前端最基本的规范

X
xqunix#3·14 年前
a = {}
(function() {})()

等价于

a = {}(function(){})();

这里解释器试图去将{}当作一个函数去调用,所以会出错。

关于分号解析规则可以参考 ecma-262 标准中的第 7.9.1 节——Rules of Automatic Semicolon Insertion

D
durden#4·14 年前

现在学习JavaScript中,其中一个头痛就是在(函数)哪加分号哪里不加...

N
normanzb2#5·14 年前

表达式后面加分号,定义后面不需要;

比如

function test(){ }

这个不需要

但是如果这样

var a = function test(){}; 那么就要加分号,否则

var a = function(foo){return foo;}

(1);

console.log(a) // 1

D
dotlife#8·14 年前

不推荐不加分号。

参与回复
登录后即可参与回复。登录