code: function hasReferenceInTDZ(node) {
      const initStart = node.range[0];
      const initEnd = node.range[1];
  
      return variable => {
          const id = variable.defs[0].name;
          const idStart = id.range[0];
          const defaultValue = (id.parent.type === "AssignmentPattern" ? id.parent.right : null);
          const defaultStart = defaultValue && defaultValue.range[0];
          const defaultEnd = defaultValue && defaultValue.range[1];
  
          return variable.references.some(reference => {
              const start = reference.identifier.range[0];
              const end = reference.identifier.range[1];
  
              return !reference.init && (
                  start < idStart ||
                  (defaultValue !== null && start >= defaultStart && end <= defaultEnd) ||
                  (start >= initStart && end <= initEnd)
              );
          });
      };
  }
docs: Creates the predicate function which checks whether a variable has their references in TDZ.
  
  The predicate function would return `true`:
  
  - if a reference is before the declarator. E.g. (var a = b, b = 1;)(var {a = b, b} = {};)
  - if a reference is in the expression of their default value.  E.g. (var {a = a} = {};)
  - if a reference is in the expression of their initializer.  E.g. (var a = a;)
  
  @param {ASTNode} node - The initializer node of VariableDeclarator.
  @returns {Function} The predicate function.
  @private