如何检查ES6上是否声明了`let`变量?

时间:2015-06-25 06:27:59

标签: javascript ecmascript-6 let

与传统的var声明变量不同,它们附加到整个封闭的函数作用域,无论它们出现在何处 - let声明附加到块作用域,但在它们出现在块中之前不会被初始化

所以:

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

var a;
let b;

所以这里似乎没有应用吊装。

问题

如果是这样,我如何安全地检查变量是否已被声明?

NB - 我看到的选项是try / catch,当然总是将let变量放在第一位。但我的问题仍然存在

2 个答案:

答案 0 :(得分:9)

  

这里似乎没有应用吊装。

不完全是。变量仍然覆盖整个范围,输入范围时创建绑定就像使用var一样。

但是你是对的,与var相反,只有当undefined语句被评估时,它才会立即用let初始化。从作用域顶部到该区域的区域称为时间死区 - 标识符已绑定,但在使用时将始终抛出ReferenceError

  

如何安全地检查变量是否已被声明?

你不能,就像你不能var s 1 一样。无论如何你都不需要这个。

1:让我们忽略全局变量 2 ,它们在这里成为全局对象的属性。
2:var / function / function* - 声明变量,我的意思是。词汇绑定(letconst)确实不会成为全局属性。

答案 1 :(得分:4)

这将是你最接近你想要的东西:

<form id="companies-search-form" v-on:submit.prevent="search">
                            <div class="form-group">
                                <div class="form-group">
                                    <label for="companyname-select">Company name</label>
                                    <select name="companyname" id="companyname-select" class="form-control">
                                        <option value="">All</option>
                                        <option v-for="company in companies"
                                                v-bind:value="company.index">
                                            {{ company.name }}
                                        </option>
                                    </select>
                                </div>
                                <div class="form-group">
                                    <label for="contactname-input">Contact name</label>
                                    <input type="text" name="contactname" class="form-control"
                                           id="contactname-input">
                                </div>
                                <div class="form-group">
                                    <input type="submit" class="btn btn-default btn-outline pull-right"
                                           value="Search">
                                </div>
                            </div>
                        </form>

尽管如此,它的用处还是值得商榷的。但如果我必须检查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块包围。但它不会破坏代码。