2013-10-23 21 views
20

有時我盯着google.com主頁提供的js,發現他們傾向於使用(0, obj.func)(args)語法。這裏是腳本的摘錄:爲什麼Google主頁使用(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?

+4

可能重複的[JavaScript語法(0,FN)(參數)(http://stackoverflow.com/questions/11541134/javascript-syntax-0-fnargs) – JJJ

+0

喔,奇怪,我真的試圖谷歌這個,但沒有遇到這個問題... –

+6

@Juhana但這次有一個實際的答案,不只是解釋逗號運算符;) – pawel

回答

33

這使得indirect call

這確保了被調用函數中的上下文是全局的。這在內部範圍內可能很有用。

實施例:

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

它看起來像這個答案不同於那個重複的......但究竟是描述這種行爲的文檔? –

+1

請記住,這段代碼可能是從另一個源代碼生成的,所以我想這是優化程序/ minifier /任何結果,並且可能不是程序員寫的。 – pawel

+0

這個和'0'幾乎可以被任何東西替換嗎? '(this,this.b)();' – MackieeE

相關問題