Navigation Menu

Skip to content

Commit

Permalink
slice the events array before looping through it and calling event ha…
Browse files Browse the repository at this point in the history
…ndlers

prevents errors from handlers that mutate the events array, e.g. by unbinding other events.
  • Loading branch information
olivernn committed Sep 21, 2012
1 parent 2a38718 commit d02dc67
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/event_emitter.js
Expand Up @@ -33,7 +33,7 @@

EventEmitter.prototype.emit = function(name) {
var args = Array.prototype.slice.call(arguments, 1)
var events = prepareEvent.call(this, name)
var events = prepareEvent.call(this, name).slice()

for (var i = 0, length = events.length; i < length; i++) {
var callback = events[i].callback
Expand Down
18 changes: 18 additions & 0 deletions test/tests/event_emitter_test.js
Expand Up @@ -50,3 +50,21 @@ test("unbinding by callback and scope", 1, function() {

ee.emit("a")
})

test("emitting events with callbacks that unbind events", function () {
var ee = new Model.EventEmitter,
eventName = 'test',
callbackCalled = false

var handler = function () {
ee.off(eventName, arguments.callee)
}

ee.on('test', handler)
ee.on('test', function () { callbackCalled = true })

ee.emit('test')

ok(callbackCalled)

})

0 comments on commit d02dc67

Please sign in to comment.