为什么我们运行以下javascript代码:
var foo = {
bar: function () {
alert('s');
}
}
//1. foo.bar();
//2. var a = foo.bar;
//3. var b = (foo.bar);
(foo.bar)();
我们会收到一条错误消息" foo未定义",但如果我们取消注释1.或2.或3.行,我们就会收到警告'&#39 ;?我知道它与Reference类型和GetValue()有关,但我并不是真的明白这一点。
由于
答案 0 :(得分:6)
这是因为你在(foo.bar)
之前没有分号。
这会导致(...)
被解释为函数调用操作符,因此它尝试调用前一个表达式,就像它是一个函数一样。
var foo = {
bar: function () {
alert('s');
}
}(foo.bar) // <-- It sees it like this
如果您使用;
终止上一个,则会有效。
var foo = {
bar: function () {
alert('s');
}
}; // <--- right here
//1. foo.bar();
//2. var a = foo.bar;
//3. var b = (foo.bar);
(foo.bar)();
因此,当其他行被取消注释时它起作用的原因是它们被终止。
如果你想排除分号(我就是这样做),如果你遵守这些规则,你通常会安全:
(
开始换行,除非您之前有;
[
开始换行,除非您之前有;
每当我使用其中一个字符开始一行时,我会在之前放置一个;
,这样我就知道之前的语句已被终止。
答案 1 :(得分:3)
在;
定义后,您需要foo
。
您的代码被解析为var foo = { ... }(foo.bar)
。
这被解释为定义一个对象,将其作为一个函数调用(如果它达到那个点就会产生不同的错误),然后将该函数的返回值作为另一个函数调用。
您得到的错误是foo
在其定义中不存在。