Вопрос по javascript – Почему переменная функции не определена, когда переменная идет после нее?

2

Я читал, что хорошей практикой является размещение оператора var, который определяет все локальные переменные в верхней части каждой функции. Следующий код показывает, почему это хорошая идея, так как, по-видимому, переменнаяafter переменная используется делает ее неопределенной.

But can someone tell me why this is the case?

<html>
    <head>
        <script type="text/javascript">
            window.onload = function() {
                var a=1;
                function foo() {
                    //a = 2; //outputs 2,2 because this overwrites the external variable value
                    //var a = 2; //outputs 2,1 because the "var" keyword creates a second variable with local scope which doesn't affect the external variable 
                    console.log(a);
                    var a = 3; //ouputs "undefined,1" ???
                }
                foo();
                console.log(a);
            };
        </script>
    </head>
    <body>

    </body>
</html>

Ваш Ответ

1   ответ
4
function foo() {
  console.log(a);
  var a = 3;
}

эквивалентно

function foo() {
  var a;
  console.log(a);
  a = 3;
}

потому что в переменной JavaScriptdeclarations подняты, ноinitializers не.

Вы можете видеть, что это буквально верно на следующем примере:

e = 0;
function foo() {
  e = 1;
  try {
    throw 2;
  } catch (e) {
    var e = 3;
    alert("In catch " + e);
  }
  alert("Before end of function " + e);
}
foo();
alert("Outside function " + e);

какие оповещения

In catch 3
Before end of function 1
Outside function 0

потому что объявление переменной поднимается такe вне функции не изменяетсяe = 1, ноe = 3 происходит внутриcatch Итак3 не влияет наe в конце функции, вместо перезаписи значения исключения.

Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededxError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Edward Tanguay
Error: User Rate Limit Exceededwith ({ x: 4 }) { var x = 5; } return x

Похожие вопросы