先看下面程序:
function foo1() { return { /*返回对象{}他留有一个大括号跟return在同一行*/ bar: "hello" }; } function foo2() { return { /*{}没在return同一行所以返回的是undefined*/ bar: "hello" }; } console.log("foo1 returns:"); console.log(foo1()); //{ bar: 'hello' } console.log("foo2 returns:"); console.log(foo2()); //undefined
可以看到,foo1和foo2函数返回对象的开始的大括号一个和return在同一行,foo2不在同一行。
于是,foo2()
返回未定义,没有任何错误被抛出。
原因:当foo2()的一行语句中只包含return时,会在return语句后面自动的加上一个分号。后面的语句也是合法的,不会抛出error,尽管它不会调用,也不做任何事(仅仅只是一个没有用到的语句块,它定义了一个等同于’hello’字符串的属性bar而已)。
即 浏览器会自作主张的在return后面加一个分号。
//foo3和上面的foo2是等价的 function foo3() { return ; //主动加分号 { /*{}没在return同一行所以返回的是undefined*/ bar: "hello" }; } console.log(foo3()); //undefined
所以建议,在JavaScript中将行开头的大括号放置在行尾的约定,而不是在新行的开头。
25道核心JavaScript面试题 https://www.toptal.com/javascript/interview-questions