引用类型和GetValue()

时间:2012-11-06 16:19:35

标签: javascript

为什么我们运行以下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()有关,但我并不是真的明白这一点。

由于

2 个答案:

答案 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在其定义中不存在。