2015-06-25 2 views
7

В отличии от традиционного вара объявленных переменных, которые прикреплены ко всему ограждающему, области видимости функция, независимо от того, где они появляются - let декларации приложить к блоку рамке, но не инициализируется, пока они не появятся в блокеКак проверить, объявлена ​​ли переменная `let` на ES6?

Итак:

console.log(a); // undefined 
console.log(b); // ReferenceError! 

var a; 
let b; 

Похоже, что подъем не применяется.

Вопрос

Если да, то как я могу безопасно проверить, если переменная была объявлена?

NB - Опция, которую я вижу, является попыткой/уловкой и, конечно же, всегда помещает переменные let сначала в область видимости. но все же остается мой вопрос

+1

Вы не можете проверить, была ли указана любая переменная (либо 'let', либо' var'). Вы можете только проверить, были ли они определены. Почему вы все равно пытаетесь это сделать? Каков ваш прецедент? –

+0

@AaditMShah Случай учится. с var я мог бы сделать: 'if (typeof a === 'undefined')' –

+3

Отредактировал свой комментарий.То, что вы делаете, - это проверка того, была ли определена переменная. Вы не проверяете, было ли оно объявлено. –

ответ

8

похоже, что подъем здесь не применяется.

Не совсем. Переменная по-прежнему охватывает всю область действия, привязка создается, когда область вводится точно так же, как и с var.

Но вы правы, в отличие от var s он не инициализируется undefined немедленно, только когда вычисляется оператор let. Область от вершины области до нее называется временной мертвой зоной - идентификатор привязан, но всегда будет выбрасывать ReferenceError при использовании.

Как можно безопасно проверить, была ли указана переменная?

Вы не можете, так же, как вы не можете для var s . Тебе это не нужно.

1: Давайте проигнорируем глобальные переменные , которые станут свойствами глобального объекта здесь.
2: var/function/function* -изъявленные переменные, я имею в виду. Лексические привязки (let, const) действительно не становятся глобальными свойствами.

+0

Bergi: IMHO с 'var' I _can_ проверить через' typeof' (кроме ситуации, когда он имеет неопределенное значение 'var g = undefined'), а также с' if ('x' в окне) '(для global - не для Области.) –

+0

@RoyiNamir: Не уверен, что вы имеете в виду, и то, что ваш вариант использования. 'typeof x' всегда возвращает' 'undefined '', если переменная не существует или имеет значение 'undefined'. Независимо от того, было ли это объявлено или нет. – Bergi

+0

Вы сказали: _Вы не можете, так же, как не можете для vars_. Я только что упомянул, что я проверяю _existence_ переменной через 'if ('a' в окне) {..}' (но он будет работать только для глобальной области) –

3

Это было бы ближе всего к тому, что вы ищете:

try { 
    console.log(typeof mima); // or any other use of variable 
    let mima = 'no ni ma'; 
} catch (error) { 
    console.log(error); // “Uncaught ReferenceError: mima is not defined(…)” 

    // and then taking some actions regarding the situation 
} 

Хотя, его полезность весьма спорно. Но если бы мне пришлось проверять переменную ed let, я бы пошел с чем-то подобным. Однако помните, что вы не можете безопасно создать отсутствующую переменную с let, так как она окружена блоком catch. Но он не сломает код.

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