Nexus,
Что касается тормозов нейтива, не поленился, протестил, резуьтат меня самого поразил, разница у меня в хроме X10 примерно. Я ожидал тормозов, но чтобы так.
<html>
<head>
<meta charset = "utf-8" />
<style>
</style>
</head>
<body>
<div id = "foo">click me foo</div>
<div id = "bar">click me bar</div>
<button id = "check">check</button>
<script>
foo.storage = []
foo.onclick = function(){var self = this; foo.storage.forEach(function(f){f.call(self)})}
var startTimeForCustom
var startTimeForNative
var endTimeForCustom
var endTimeForNative
foo.storage.push(function(){startTimeForCustom = new Date()})
i = 10000
while(i--) foo.storage.push(function(){return 1 + 1})
foo.storage.push(function(){endTimeForCustom = new Date(); console.log("end custom")})
bar.addEventListener("click", function(){startTimeForNative = new Date()})
i = 10000
while(i--) bar.addEventListener("click", function(){return 1 + 1})
bar.addEventListener("click", function(){endTimeForNative = new Date(); console.log("end native")})
check.onclick = function(){
console.log("custom: " + (endTimeForCustom - startTimeForCustom))
console.log("native: " + (endTimeForNative - startTimeForNative))
}
</script>
</body>
</html>
И это при том, что перебор идет через нативный форич, то есть можно еще оптимизировать циклом.