引用类型和GetValue()函数

3
如果我们运行以下 JavaScript 代码:
        var foo = {
           bar: function () {
               alert('s');
           }
       }

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

我们如果不注释掉1、2或3行代码,就会得到一个错误信息“foo未定义”,但是如果注释掉1、2或3行代码,我们会得到一个警告框弹出's'?我知道这与引用类型和GetValue()有关,但我真的不明白重点在哪里。
谢谢。
2个回答

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)();

因此,当其他行被取消注释时它能工作的原因是它们已经终止了。
如果你想要排除分号 (这就是我所做的),你通常可以遵循以下规则来确保安全:
  • 不要以 ( 开始一行,除非在它之前有一个 ;
  • 不要以 [ 开始一行,除非在它之前有一个 ;
每当我以其中一个字符开始一行时,我会在它之前放一个 ;,这样我就知道前一个语句已经终止了。

3

在定义foo后面需要加上;

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

这被解释为定义一个对象,将其作为函数调用(如果已经到达该点,则会产生不同的错误),然后将该函数的返回值作为另一个函数调用。

您得到的错误是foo在其定义内不存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接