2016-01-27 3 views
1
var func = function() { 
    var i: number = 0; 
    if (i == 0) { 
     var y: number = 1; 
    } 

    document.body.innerHTML = y.toString(); // js/ts should complain me in this line 
}; 

func(); // output: 1 

Как вы можете видеть, я объявила переменную y внутри блока if. Поэтому я думаю, что на него нельзя ссылаться вне сферы действия.Доступ к переменной в блоке

Но, когда я попытался запустить код, выход 1.

Это проблема в машинописном тексте/javascript?

+2

Нет, это по дизайну. –

+3

'var' в' if' имеет значение для функции, а не if. – Sam

+3

Я не думаю, что машинопись отличается от javascript здесь, а 'var' имеет область функций. Вместо этого используйте 'let'. – Bergi

ответ

5

Переменные в Javascript: hoisted, что означает, что var y перемещается в начало функции, как если бы оно было объявлено там.

Initialization, однако не поднимается, так что если вы меняете i быть что-то другое, чем 0, переменная y будет по-прежнему существует, но она будет иметь значение undefined.

Это означает, что функция в точности эквивалентно:

var func = function() { 
    var i: number = 0; 
    var y: number; 
    if (i == 0) { 
     y = 1; 
    } 

    document.body.innerHTML = y.toString(); // js/ts should complain me in this line 
}; 

Чтобы получить поведение вы ожидаете, что вам нужно использовать let, который является частью ECMAScript 2015 (ES6). Как вы ожидаете, это блокировка блоков. Он также будет эффективно работать, чтобы он был доступен только с точки определения вперед, что также возможно, как и следовало ожидать.

+0

Большое спасибо! +1 для 'let' вместо' var' –

1

Если вы повторно объявите переменную JavaScript, она не потеряет ее значение.

Вторая ссылка может проложить путь для нового синтаксиса переменных. На самом деле, если вы вспомните объявление переменной, в javascript не обязательно. Simpe

y = 1;

также работает.

Во второй раз, когда вы ссылаетесь на y, снаружи, если блок, на мой взгляд, он пытается повторно объявить и сохраняет старое значение.

Ссылка - http://www.w3schools.com/js/js_variables.asp & http://www.w3schools.com/js/js_scope.asp

1

Javascript имеет функцию сферы AFAIK. Любая переменная, объявленная внутри функции, должна быть доступна из любой точки внутри функции. Итак, если у вас есть функция проверки if i == 0, то вы можете достичь того, чего вы пытаетесь достичь.

1

Это как и должно быть. Область Javascript по функции, а не по блоку. (Это делает его в отличие от многих популярных языков)

Переменные, объявленные как var myVar = 10;, будут просачиваться в вложенные функции, но не наоборот. Переменные, объявленные как myVar = 10;, станут глобальными.

Я не мог найти ничего, что предполагало, что машинопись была другой.

1

Переменные, объявленные внутри оператора if, не относятся к заявлению if. Они привязаны к текущему контексту выполнения. Существует глобальный контекст выполнения, а затем, когда функция запускается, создается собственный контекст выполнения. Внутри вашей функции вы создали переменные y и i. Не имеет значения, что y был создан внутри оператора if, поскольку после его запуска в рамках функции создается y. Итак, вы делаете y.toString(), который может получить доступ к y, потому что он ограничен функцией, а не оператором if. Вот почему вы получаете вывод 1. Это не ошибка, это по дизайну.

Смежные вопросы