今天遇到一道有意思的题目,具体如下:
请问以下代码的输出结果是什么?()
var a = 10
(function(){
console.log(2);
})()
A. 输出10
B. Error:10 is not a function
C. a is not defined
D. 输出2
不知道会不会有小伙伴像我一样直接选了D,经过我验证后发现正确答案是B。
为什么会是这样呢,我尝试在var a = 10;
后面加了分号后得到了D选项的结果,但是此时我仍然不明白为什么浏览器把10当作了函数,于是我就想一探究竟,难道给a变量赋值一个函数就正确了吗?然后我就又写了下面这样的代码:
var a = function b(){}
(function(){
console.log(2)
})()
结果这次的输出结果也不是想要的样子
然后我在var a = function b(){};
后面加了分号,结果又对了
然后我去查看了一下ECMAScript的语言规范,ECMAScript具有自动分号插入规则:
大致意思就是在上面的代码中不会进行自动插入分号,立即执行函数相当于被这样解析:
var a = 10( function(){ console.log(2) } )()
这样看起来是不是就明显了许多,所以会报错:10 is not a function
所以在经常会发现有些脚本写了立即执行函数前面都要写个分号,就是怕出现这样的情况。
最后附上:ECMAScript的语言规范