Обоснование 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);