code: function removeOverriddenLoopVariables(astNode, loopVariables) {
      var result = loopVariables;
  
      if (astNode && astNode.type === 'VariableDeclarator') {
      }
      if (!astNode || hasScopeChanged(astNode)) {
          return loopVariables; // new scope: any variables therein have no bearing on current scope
      }
      if (astNode.type === 'VariableDeclaration') {
          result = processScopeVariables(astNode, loopVariables);
      }
      _.forOwn(astNode, function (childNode) {
          if(astNode !== childNode) {
              result = removeOverriddenLoopVariables(childNode, result);
          }
      });
  
      return result;
  }
docs: remove variables from the 'loopVariables' array if they are being redefined in the new function scope.
  All variables are retrieved from the current AST node and iteratively compared with the content in loopVariables
  If the given node contains child nodes this function will be called (recursively) with the child nodes
  
  @param astNode the node to search for overriding variables in
  @param loopVariables array of variables that belong to a loop invariant and therefore should be exempt from mutations
  @returns {array} a new array containing loop variables - fewer than the original if some were being overridden in the new function scope