2013-09-29 35 views
0

code in question爲什麼在窗口對象中將全局聲明的變量的值設置爲相同的值?

(function(window){ 
    ps = {}, 
    ps = window.ps, 
    ps.subscriptions = [], 
    ps.subscribe = function(name, callback){ 
     ps.subscriptions.push({"name": name, "callback": callback}); 
     return [name,callback]; 
    }, 
    ps.unsubscribe = function(args){ 
     for(x=0;x<ps.subscriptions.length;x++){ 
      if(ps.subscriptions[x].name == args[0], ps.subscriptions[x].callback == args[1]) 
       ps.subscriptions.splice(x, 1); 
     } 
    }, 
    ps.publish = function(name, args){ 
     var temp = []; 
     if(ps.subscriptions.length > 0){ 
      for(var x=0;x<ps.subscriptions.length;x++) { 
       if(ps.subscriptions[x].name == name) 
        temp.push({"fn":ps.subscriptions[x].callback}); 
      } 
      for(x=0;x<temp.length;x++){ 
       temp[x].fn.apply(this,[args]); 
      } 
     } 
    }; 

    console.log(window.ps); 
    console.log(ps); 
})(window); 

我的問題:

  1. 我認爲所有的方法/變量被宣佈在global範圍,是否正確?我問,因爲這個假設驅動了我有的其他問題,我想確保我沒有錯過任何東西。
  2. 如果在上述行中他已經在全局範圍內聲明瞭ps,那麼在做什麼ps = window.ps?是不是正在做什麼相當於ps = ps
  3. 如果問題2中提到的上述邏輯有一個名稱或約定, 是什麼?我想不出有什麼方法可以讓Google看到我在看什麼。

如果任何人有更好的方式來描述技術,並想更新我的問題標題,以便更容易找到,請隨時這樣做。

+0

該代碼在開始時缺少'var'關鍵字。它會在「嚴格」模式下引發錯誤。 – Pointy

+0

@積分好的,很好。當我看到變量被聲明的方式並開始思考「什麼......」時,我並不瘋狂。 –

+0

是的,懶惰的隱式全局變量是一種不好的做法,可能會導致各種各樣令人頭疼的錯誤。 – Pointy

回答

1

這是錯誤的代碼。一個更好的辦法來做到這一點是:

(function(window){ 
    var ps = window.ps || {}, 
    ps.subscriptions = [], 
    // ... 

    window.ps = ps; 
})(this); 

良好的措施,我會在一開始也加入

"use strict"; // turn on "strict" mode 

相關問題