JavaScript 'подъем' [дубликат]


этот вопрос уже есть ответ здесь:

я наткнулся на JavaScript "подъем", и я не понял, как этот фрагмент кода действительно функционирует:

var a = 1;

function b() {
    a = 10;
    return;

    function a() {}
}

b();
alert(a);

Я знаю, что объявление функции как ( function a() {} ) будет поднят в верхней части функции b область, но она не должна переопределять значение a (потому что объявления функций переопределяют объявления переменных, но не инициализацию переменных) поэтому я ожидал, что значение предупреждения будет равно 10 вместо 1!!

5 78

5 ответов:

  1. глобальные a установлено значение 1
  2. b() называется
  3. function a() {} поднимается и создает местные переменная a это маскирует глобальный a
  4. местный a установлено значение 10 (перезапись функция a)
  5. глобальные 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  
  1. объявление функции function a(){} поднимается первым, следовательно, в локальной области это.
  2. если у вас есть две переменные с одинаковым именем (одна в глобальной, другая в локальной), локальная переменная всегда имеет приоритет над глобальной переменной.
  3. при установке 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();

надеюсь, что это помогает