code: function getCallbackInfo(node) {
      const retv = { isCallback: false, isLexicalThis: false };
      let currentNode = node;
      let parent = node.parent;
  
      while (currentNode) {
          switch (parent.type) {
  
              // Checks parents recursively.
  
              case "LogicalExpression":
              case "ConditionalExpression":
                  break;
  
              // Checks whether the parent node is `.bind(this)` call.
              case "MemberExpression":
                  if (parent.object === currentNode &&
                      !parent.property.computed &&
                      parent.property.type === "Identifier" &&
                      parent.property.name === "bind" &&
                      parent.parent.type === "CallExpression" &&
                      parent.parent.callee === parent
                  ) {
                      retv.isLexicalThis = (
                          parent.parent.arguments.length === 1 &&
                          parent.parent.arguments[0].type === "ThisExpression"
                      );
                      parent = parent.parent;
                  } else {
                      return retv;
                  }
                  break;
  
              // Checks whether the node is a callback.
              case "CallExpression":
              case "NewExpression":
                  if (parent.callee !== currentNode) {
                      retv.isCallback = true;
                  }
                  return retv;
  
              default:
                  return retv;
          }
  
          currentNode = parent;
          parent = parent.parent;
      }
  
      /* istanbul ignore next */
      throw new Error("unreachable");
  }
docs: Checkes whether or not a given node is a callback.
  @param {ASTNode} node - A node to check.
  @returns {Object}
  {boolean} retv.isCallback - `true` if the node is a callback.
  {boolean} retv.isLexicalThis - `true` if the node is with `.bind(this)`.