function forEach(collection, callback, thisArg) {
      if (callback && typeof thisArg == 'undefined' && isArray(collection)) {
        var index = -1,
            length = collection.length;

        while (++index < length) {
          if (callback(collection[index], index, collection) === false) {
            break;
          }
        }
      } else {
        baseEach(collection, callback, thisArg);
      }
      return collection;
    }
Iterates over elements of a collection, executing the callback for each
element. The callback is bound to `thisArg` and invoked with three arguments;
(value, index|key, collection). Callbacks may exit iteration early by
explicitly returning `false`.

Note: As with other "Collections" methods, objects with a `length` property
are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`
may be used for object iteration.

@static
@memberOf _
@alias each
@category Collections
@param {Array|Object|string} collection The collection to iterate over.
@param {Function} [callback=identity] The function called per iteration.
@param {*} [thisArg] The `this` binding of `callback`.
@returns {Array|Object|string} Returns `collection`.
@example

_([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');
// => logs each number and returns '1,2,3'

_.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });
// => logs each number and returns the object (property order is not guaranteed across environments)