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
установлено значение1
b()
называется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();
надеюсь, что это помогает