once.js
 1  var wrappy = require('wrappy')
 2  module.exports = wrappy(once)
 3  module.exports.strict = wrappy(onceStrict)
 4  
 5  once.proto = once(function () {
 6    Object.defineProperty(Function.prototype, 'once', {
 7      value: function () {
 8        return once(this)
 9      },
10      configurable: true
11    })
12  
13    Object.defineProperty(Function.prototype, 'onceStrict', {
14      value: function () {
15        return onceStrict(this)
16      },
17      configurable: true
18    })
19  })
20  
21  function once (fn) {
22    var f = function () {
23      if (f.called) return f.value
24      f.called = true
25      return f.value = fn.apply(this, arguments)
26    }
27    f.called = false
28    return f
29  }
30  
31  function onceStrict (fn) {
32    var f = function () {
33      if (f.called)
34        throw new Error(f.onceError)
35      f.called = true
36      return f.value = fn.apply(this, arguments)
37    }
38    var name = fn.name || 'Function wrapped with `once`'
39    f.onceError = name + " shouldn't be called more than once"
40    f.called = false
41    return f
42  }