【问题标题】:Why does google main page use (0, obj.func)(args) syntax?为什么谷歌主页使用 (0, obj.func)(args) 语法?
【发布时间】:2013-10-23 07:36:16
【问题描述】:

有时我盯着google.com主页提供的js,发现他们倾向于使用(0, obj.func)(args)语法。以下是脚本的摘录:

 var _ = _ || {};
 (function (_) {
     var window = this;
     try {
         _.mb = function (a) {
             return (0, window.decodeURIComponent)(a.replace(/\+/g, " "))
         };
         _.zg = function (a, b) {
             for (var c = a.length ? a.split("&") : [], d = 0; d < c.length; d++) {
                 var e = c[d];
                 if ((0, _.Ag)(e) == b) return (c = /=(.*)$/.exec(e)) ? (0, _.mb)(c[1]) : null
             }
             return null
         };
         _.Ag = function (a) {
             return (a = /^(.+?)(?:=|$)/.exec(a)) ? (0, _.mb)(a[1]) : null
         };
         var Cg = function (a, b) {
                 var c = a.indexOf("?");
                 return 0 > c ? null : (0, _.zg)(a.substring(c + 1), b)
             };
         // Note var Cg called with no 0
         var oca = function (a) {
                 this.A = Cg(a, "mods");
                 this.B = Cg(a, "ver")
             };
     } catch (e) {}
 })(_);  

为什么要添加 0?

【问题讨论】:

  • Javascript syntax (0, fn)(args) 的可能重复项
  • @Juhana 但这次有一个实际的答案,而不仅仅是逗号运算符的解释;)
  • 确实如此。我有点希望dystroy能回答那个问题。
  • 感谢 dystroy,我宁愿将该问题标记为与此问题重复...
  • 实际上,所有其他问题都应标记为此问题的副本,因为此问题有正确答案。

标签: javascript


【解决方案1】:

这会生成一个indirect call

这确保了被调用函数中的上下文是全局的。这在内部范围内可能很有用。

例子:

var a = {
  b: function(){
     console.log(this);    
  },
  c1: function(){
     this.b(); 
  },
  c2: function(){
     (0, this.b)(); 
  },
  c3: function(){
     (this.b)(); 
  }
}
a.c1(); // logs a
a.c2(); // logs window
a.c3(); // logs a

【讨论】:

  • 看起来这个答案与那个副本不同......但是描述这种行为的文档到底在哪里?
  • 请记住,这段代码可能是从另一个来源生成的,所以我猜它是优化器/压缩器/其他任何东西的结果,程序员可能不是这样编写的。
  • @MackieeE 是的。抱歉,我现在没有时间发表更多评论,我正在开会...
  • @MackieeE 加密前可能是一样的。当值无关紧要时,我个人也使用0,如Array.apply(0,Array(10)).map(Math.random)
  • @Anony-Mousse 有些人看重可靠性,有些人看重表达的简单性,但更多的人看重两者。 javascript 不如 java 可靠这一事实并不能阻止它更具表现力。它们在正交轴上。然而,作为一种更具表现力的语言,它确实可以以一种不那么 uglymessy 的方式使用它。
猜你喜欢
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
相关资源
最近更新 更多