JavaScript 'подъем' [дубликат]
этот вопрос уже есть ответ здесь:
- функция Javascript scoping and hoisting 14 ответов
я наткнулся на JavaScript "подъем", и я не понял, как этот фрагмент кода действительно функционирует:
var a = 1;
function b() {
a = 10;
return;
function a() {}
}
b();
alert(a);
Я знаю, что объявление функции как ( function a() {} ) будет поднят в верхней части функции b область, но она не должна переопределять значение a (потому что объявления функций переопределяют объявления переменных, но не инициализацию переменных) поэтому я ожидал, что значение предупреждения будет равно 10 вместо 1!!
5 ответов:
- глобальные
aустановлено значение1b()называетсяfunction a() {}поднимается и создает местные переменнаяaэто маскирует глобальныйa- местный
aустановлено значение10(перезапись функцияa)- глобальные
a(все равно1) предупреждается
это потому, что порядок компиляции/интерпретации в данном примере несколько вводит в заблуждение. Элемент
function a () {}строка интерпретируется до выполнения любой из остальных функций, поэтому в самом начале функцииaимеет значениеfunction a () {}. Когда вы переназначаете его на10, вы переназначаете значениеaв локальной области видимости функцииb(), который затем отбрасывается после возвращения, оставляя исходное значениеa = 1в глобальном масштаб.вы можете проверить это, поместив
alert()или как в соответствующих местах, чтобы увидеть, что значениеaнаходится в разных точках.
(1) JavaScript не имеет области действия оператора block; скорее, он будет локальным для кода, в котором находится блок.
(2) объявление переменных Javascript в области функции, что означает, что переменные, объявленные в функции, доступны в любом месте этой функции, даже до присвоения им значения.
(3) в теле функции локальная переменная имеет приоритет над глобальной переменная с тем же именем. если вы объявляете локальную переменную или параметр функции с тем же именем, что и глобальная переменная, вы эффективно скрыть глобальную переменную.
Вы код такой же, как: (читать комментарий)
<script> var a = 1; //global a = 1 function b() { a = 10; var a = 20; //local a = 20 } b(); alert(a); //global a = 1 </script>ссылки:
(1) Область Действия Переменной JavaScript:
(2) опасный пример Javascript Подъем
(3) переменнаяТак в коде:
var a = 1; //global a = 1 function b() { a = 10; return; function a() {} //local } b(); alert(a); //global a = 1
- объявление функции
function a(){}поднимается первым, следовательно, в локальной области это.- если у вас есть две переменные с одинаковым именем (одна в глобальной, другая в локальной), локальная переменная всегда имеет приоритет над глобальной переменной.
- при установке
a=10, вы устанавливаете локальную переменнуюa, а не глобальный.следовательно, значение глобальной переменной остается таким же, и вы получаете, предупрежденный 1
когда я прочитал ту же статью, что и вы JavaScript Scoping and Hoisting, Я тоже был смущен, потому что автор никогда не показывал, что два открывающих примера кода интерпретируются как в компиляторе.
вот пример вы предоставили, а второй на странице:
var a = 1; function b() { function a() {} // declares 'a' as a function, which is always local a = 10; return; } b(); alert(a);и вот первый пример на странице:
var foo = 1; function bar() { var foo; // a new local 'foo' variable if (!foo) { foo = 10; } alert(foo); } bar();надеюсь, что это помогает