function watchGroupAction() {
          changeReactionScheduled = false;

          try {
            if (firstRun) {
              firstRun = false;
              listener(newValues, newValues, self);
            } else {
              listener(newValues, oldValues, self);
            }
          } finally {
            for (var i = 0; i < watchExpressions.length; i++) {
              oldValues[i] = newValues[i];
            }
          }
        }
@ngdoc method
@name $rootScope.Scope#$watchGroup
@kind function

@description
A variant of {@link ng.$rootScope.Scope#$watch $watch()} where it watches an array of `watchExpressions`.
If any one expression in the collection changes the `listener` is executed.

- The items in the `watchExpressions` array are observed via the standard `$watch` operation. Their return
  values are examined for changes on every call to `$digest`.
- The `listener` is called whenever any expression in the `watchExpressions` array changes.

@param {Array.<string|Function(scope)>} watchExpressions Array of expressions that will be individually
watched using {@link ng.$rootScope.Scope#$watch $watch()}

@param {function(newValues, oldValues, scope)} listener Callback called whenever the return value of any
   expression in `watchExpressions` changes
   The `newValues` array contains the current values of the `watchExpressions`, with the indexes matching
   those of `watchExpression`
   and the `oldValues` array contains the previous values of the `watchExpressions`, with the indexes matching
   those of `watchExpression`
   The `scope` refers to the current scope.
@returns {function()} Returns a de-registration function for all listeners.