3

为什么如果我们运行以下 javascript 代码:

        var foo = {
           bar: function () {
               alert('s');
           }
       }

      //1. foo.bar();
      //2. var a = foo.bar;
      //3. var b = (foo.bar);          
       (foo.bar)();

我们将收到一条错误消息“foo is undefined”,但如果我们取消注释 1. 或 2. 或 3. 行,我们将收到警报“s”?我知道这是关于引用类型和 GetValue(),但我不太明白这一点。

谢谢

4

2 回答 2

6

这是因为 . 之前没有分号(foo.bar)

这导致(...)被解释为函数调用运算符,因此它试图调用前面的表达式,就好像它是一个函数一样。

  var foo = {
       bar: function () {
           alert('s');
       }
   }(foo.bar) // <-- It sees it like this

如果你用 a 终止前一个;,它会起作用。

   var foo = {
       bar: function () {
           alert('s');
       }
   }; // <--- right here

  //1. foo.bar();
  //2. var a = foo.bar;
  //3. var b = (foo.bar);          
   (foo.bar)();

因此,当其他行未注释时它起作用的原因是它们被终止了。

如果你想排除分号(我就是这样做的),如果你遵循这些规则,你通常是安全的:

  • 永远不要以 a 开始新行,(除非;它之前有 a
  • 永远不要以 a 开始新行,[除非;它之前有 a

每当我用其中一个字符开始一行时,我都会; 它前面放一个,这样我就知道前面的语句已经终止了。

于 2012-11-06T16:21:20.597 回答
3

您需要;在定义foo.

您的代码被解析为var foo = { ... }(foo.bar).

这被解释为定义一个对象,将它作为一个函数调用(如果它到达那一点,它会给出不同的错误),然后将该函数的返回值作为另一个函数调用。

您得到的错误是foo它的定义中不存在。

于 2012-11-06T16:21:16.257 回答