function debounced() {
        // Optimized: no leaking arguments
        var args = []; for(var $i = 0, $len = arguments.length; $i < $len; $i++) args.push(arguments[$i]);
        cancelFunction(debounced);
        setDelay(debounced, ms, fn, this, args);
      }
@method debounce([ms] = 1)
@returns Function
@short Creates a "debounced" function that postpones its execution until
       after `ms` milliseconds have passed.
@extra This method is useful to execute a function after things have
       "settled down". A good example of this is when a user tabs quickly
       through form fields, execution of a heavy operation should happen
       after a few milliseconds when they have "settled" on a field.

@example

  var fn = logHello.debounce(250)
  runTenTimes(fn); -> called once 250ms later

@param {number} [ms]

*