2013-07-07 81 views
0

我正在阅读Addy Osmani的Cranium.js(https://gist.github.com/addyosmani/3769967)代码,我无法理解JavaScript的两行代码。整个代码如下:了解Cranium.js代码

// Mix in to any object in order to provide it with custom events. 
var Events = Cranium.Events = { 
     channels: {}, 
     eventNumber: 0, 
     trigger: function (events, data) { 
      for (var topic in Cranium.Events.channels){ 
       if (Cranium.Events.channels.hasOwnProperty(topic)) { 
        if (topic.split("-")[0] == events){ 
         Cranium.Events.channels[topic](data) !== false || delete Cranium.Events.channels[topic]; 
        } 
       } 
      } 
     }, 
     on: function (events, callback) { 
      Cranium.Events.channels[events + --Cranium.Events.eventNumber] = callback; 
     }, 
     off: function(topic) { 
      delete Cranium.Events.channels[topic]; 
     }    
}; 

我不明白,第一行是:

if (topic.split("-")[0] == events){ 
          Cranium.Events.channels[topic](data) !== false || delete Cranium.Events.channels[topic]; 
         } 

那就是:我明白了,如果有什么我不明白是什么是内部发生大括号。在我看来(但我可能是错的),如果左边的表达是真的,什么也不会发生,如果不是,他会删除Cranium.Events.channels[topic]

第二行,我不明白的是:

Cranium.Events.channels[events + --Cranium.Events.eventNumber] = callback; 

我不明白的双减号。

任何意见表示赞赏。

+1

所以你的问题是更通用的“** **和** - **是什么意思?” - 首先是正常的'OR' taht在这种情况下转换为正常的'if'子句,因为左边的操作是布尔型的,第二个与'Cranium.Events.eventNumber = Cranium.Events.eventNumber - 1'相同。 ,但是因为它在后面,'--Cranium.Events.eventNumber'而不是'Cranium.Events.eventNumber - '它将首先计数并在操作后给你数字。 – balexandre

+0

也许,我不明白的是大局:也就是说,我不明白他为什么要进行这种减法。谢谢:-) – ContentiousMaximus

回答

3
if (topic.split("-")[0] == events){ 
    Cranium.Events.channels[topic](data) !== false || delete Cranium.Events.channels[topic]; 
} 

相同

if (topic.split("-")[0] == events){ 
    if (Cranium.Events.channels[topic](data) === false) { 
     delete Cranium.Events.channels[topic]; 
    } 
} 

Cranium.Events.channels[events + --Cranium.Events.eventNumber] = callback;--Cranium.Events.eventNumber应用之前减去1。所以,如果它以前是3,那么它将被添加到events

+0

你的第二个'if'缺少'=== false'检查。最初的回调可能会返回undefined,0或其他falsy值而不会触发delete。 – DCoder

+0

你是对的。我已经更新了我的答案。 – kalley