【问题标题】:Purpose of var a = b.c = function(){} syntaxvar a = b.c = function(){} 语法的用途
【发布时间】:2012-01-15 18:35:59
【问题描述】:

我最近浏览了js代码,下面的语法不断出现:

var foo = bar.bi = function() {...}

这对我来说是不熟悉的语法。是否只是为同一个函数定义两个名称?如果是这样,为什么不只定义为bar.bi = function()

【问题讨论】:

    标签: javascript function syntax


    【解决方案1】:

    同时为变量和bar对象的bi属性赋值。

    这样对象的属性获取值,但你仍然可以将它作为变量引用,这可能会快一点。

    实际上与...相同

    bar.bi = function() {...};
    var foo = bar.bi;
    
    foo === bar.bi; // true
    

    或者您可以将其可视化为...

    var foo = ( bar.bi = function() {...} );
    

    所以首先分配给bar.bi。赋值表达式返回的结果是同一个函数,该结果被赋值给foo

    【讨论】:

      【解决方案2】:

      除了将函数分配给 2 个变量之外,上下文还会根据您调用它的方式而变化。

      bar.bi();
      

      会将其上下文作为bar 对象,就好像您会使用它一样:

      foo.call(bar);
      

      但是在其他变量中使用它,像这样:

      foo();
      

      将使用foo 的上下文。因此,如果foo 在全局上下文中,它将等价于:

      bar.bi.call(window);
      

      【讨论】:

      • @Fdr - 我不知道。我还没有真正看到过它的实际效果,但很高兴知道。
      【解决方案3】:

      这只是一个复合作业

      var r = x = 3;
      

      将 3 赋给 x,也赋给新声明的 r。

      您的示例只是用一个函数代替 3,并用一个对象属性 —bar.bi — 代替 x

      【讨论】:

        【解决方案4】:

        这取决于它在哪里使用。

        foobar.bi在这里都指向同一个函数。这意味着可以使用调用该函数

        foo();
        

        bar.bi();
        

        同时函数内部this的值也不同。要使第一个等于第二个,应该如下调用它

        foo.call(bar);  
        

        foo.apply(bar);
        

        这确保this 将指向函数内部的bar

        请参考:

        https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call.

        https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply.

        .

        【讨论】:

          【解决方案5】:
          var foo = bar.bi = function() {...};
          
          
          
          bar.bi === function() {...} //true
          
          foo === bar.bi //true
          

          bar 将是一个响应方法 bi 的对象。

          【讨论】:

          • 我想你会发现你的前两个 === 比较将是 // false 因为你正在比较两个不同的函数对象。你的最后一个当然是正确的。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-27
          • 2015-05-27
          • 2012-02-02
          • 1970-01-01
          • 2014-04-12
          • 1970-01-01
          相关资源
          最近更新 更多