Search code examples
javascriptreturnautomatic-semicolon-insertion

Why does a function return undefined if a newline character appears after the `return` keyword?


When lsEstimator is an array with 2 elements, this function returns true:

function got_estimators() {
  var retval = 
   (typeof lsEstimator != 'undefined' &&
    lsEstimator != null &&
   lsEstimator.length > 0);
  return retval;
}

but this function doesn't (it returns undefined, I think, in Chrome and FF):

function got_estimators() {
   return 
      (typeof lsEstimator != 'undefined' &&
      lsEstimator != null &&
      lsEstimator.length > 0);
}

Why?


Solution

  • Because of the line break after return in the second example. The code is evaluated as:

    function got_estimators() {
       return; // <-- bare return statement always results in `undefined`.
       (typeof lsEstimator != 'undefined' &&
        lsEstimator != null &&
        lsEstimator.length > 0);
    }
    

    JavaScript is not even evaluating the logical operators.

    Why does this happen? Because JavaScript has automatic semicolon insertion, i.e. it tries to insert semicolons "where it makes sense" (more information here).

    Put the return keyword and the return value in the same line:

    return (typeof lsEstimator != 'undefined' &&
      lsEstimator != null &&
      lsEstimator.length > 0);