--- /dev/null
+module.exports = throttle;
+
+/**
+ * Returns a new function that, when invoked, invokes `func` at most once per `wait` milliseconds.
+ *
+ * @param {Function} func Function to wrap.
+ * @param {Number} wait Number of milliseconds that must elapse between `func` invocations.
+ * @return {Function} A new function that wraps the `func` function passed in.
+ */
+
+function throttle (func, wait) {
+ var ctx, args, rtn, timeoutID; // caching
+ var last = 0;
+
+ return function throttled () {
+ ctx = this;
+ args = arguments;
+ var delta = new Date() - last;
+ if (!timeoutID)
+ if (delta >= wait) call();
+ else timeoutID = setTimeout(call, wait - delta);
+ return rtn;
+ };
+
+ function call () {
+ timeoutID = 0;
+ last = +new Date();
+ rtn = func.apply(ctx, args);
+ ctx = null;
+ args = null;
+ }
+}