Обоснование JavaScript

В чем разница между нижеприведенными фрагментами?

var a = 0;
function b(){
    a = 10;
    return function a(){};
}
b();
console.log(a);  // => 10

а также

var a = 0;
function b(){
    a = 10;
    return
    function a(){};
}
b();
console.log(a);  // => 0

Это как-то связано с подъемом JavaScript, но мое понимание концепции дает совершенно противоположный результат.

Ответ 1

return function a(){};

Здесь function... является выражением. Истинное выражение функции будет точным. Здесь не имеет большого значения, он просто дает анонимной функции в a .name, но это еще только выражение функции, что вы возвращаются.

return 
function a(){};

Это здесь эквивалентно:

return;
function a(){};

Здесь function a является объявлением, а не выражением. Он поднят, создав локальное имя a в области, затеняя внешний a. Т.е. это эквивалентно:

function b(){
    var a = function () {};
    a = 10;
    return;
}

Ответ 2

return
function a() {}

такое же, как

return;
function a() {}

после автоматической установки точки с запятой. Во втором случае функция a перемещается в начало области. Код такой же, как и

var a = 0;

function b() {
  function a() {};
  a = 10;
  return;
}
b();
console.log(a);

В внутри a b() является внутренней функцией, а затем перекрываться, он не доступен из - за пределов b().

Вот демо, чтобы понять, как работает подъем.

var a = 0;

function b() {
  console.log(a); // function
  a = 10;
  console.log(a); // 10
  return

  function a() {};
}
console.log(b()); // undefined
console.log(a);

Ответ 3

Линейный разрыв может использоваться вместо точки с запятой.

Это:

var a = 0;
function b(){
    a = 10;
    return // line-break
    function a(){};
}
b();
console.log(a);  // => 0

означает следующее:

var a = 0;
function b(){
    a = 10;
    return; // <-- 'adds this semicolon'
    function a(){};
}
b();
console.log(a);  // => 0

Если вам нужен этот перерыв, вы можете сделать вот так:

var a = 0;
function b(){
    a = 10;
    return (
        function a(){}
    )
}
b();
console.log(a);