当前位置: 首页 > 面试题库 >

JavaScript ES6中是否不使用let或const声明的变量?

都建树
2023-03-14
问题内容

我玩ES6已有一段时间了,我注意到虽然用声明的变量var被按预期悬挂了…

console.log(typeof name); // undefined
var name = "John";

…声明letconst似乎存在一些问题的变量:

console.log(typeof name); // ReferenceError
let name = "John";

console.log(typeof name); // ReferenceError
const name = "John";

这是否意味着使用letconst不声明的变量被吊起?这到底是怎么回事?是否有任何区别let,并const在此问题?


问题答案:

@thefourtheye的正确说法是在声明这些变量之前 无法访问 它们。但是,这要复杂得多。

是否用letconst不声明变量?这到底是怎么回事?

所有声明varletconstfunctionfunction*class被“悬挂”
在JavaScript。这意味着,如果在范围内声明了名称,则在该范围内,标识符将始终引用该特定变量:

x = "global";
// function scope:
(function() {
    x; // not "global"

    var/let/… x;
}());
// block scope (not for `var`s):
{
    x; // not "global"

    let/const/… x;
}

对于函数作用域和块作用域1都是如此。

之间的差var/ function/ function*声明和let/ const/ class声明是 初始化
。当在范围的顶部创建绑定时
可以使用undefined或(生成器)函数对前者进行初始化。但是,按词法声明的变量保持 未初始化状态
。这意味着ReferenceError您尝试访问它时将引发异常。它只会得到当初始化let/ const/
class这就是所谓的(上述)之前声明进行评估,一切 时间盲区

x = y = "global";
(function() {
    x; // undefined
    y; // Reference error: y is not defined

    var x = "local";
    let y = "local";
}());

请注意,一条let y;语句使用undefinedlike进行了初始化let y = undefined;

时间 盲区不是语法的位置,而是 时间
的变量(范围)的创建和初始化之间。只要未执行该代码(例如,函数体或简单的死代码),就可以在声明上方的代码中引用该变量不是一个错误,并且如果在初始化之前访问变量,即使访问该变量,也会引发异常。代码位于声明下方(例如,在过早调用的提升函数声明中)。

是否有任何区别let,并const在此问题?

不,就吊装而言,它们的作用相同。它们之间的唯一区别是,const蚂蚁必须是并且只能在声明的初始化程序部分中分配(const one = 1;const one;以及以后的重新分配one = 2都无效)。

1:当然,var声明仍然仅在功能级别上起作用



 类似资料:
  • 我正在尝试向我的网站添加一个喜欢的功能。我使用以下模式制作了一个喜欢的集合。我正在使用自定义_id来避免创建额外的索引。 我的服务器上有一个路由,它使用MongoDB聚合搜索帖子集合。我正在尝试向当前管道中添加一个$lookup阶段,以便添加一个liked属性,该属性的类型为布尔值,表示用户是否喜欢该帖子。下面是无法工作的$查找阶段(liked始终返回空数组,即使有相应的liked文档): 我认为

  • 问题内容: 是否可以在Gradle中声明一个可在Java中使用的变量?基本上,我想在build.gradle中声明一些var,然后在构建时(显然)获取它。就像C / C ++中的预处理器宏一样… 一个声明的例子就是这样: 有没有办法做这样的事情? 问题答案: 生成Java常量 你可以使用 产生Android资源 你可以使用或以通常的方式访问它们

  • 我以下这篇文章:SQL:插入到...值...选择 我的问题是如何声明从SELECT语句中分配值的临时@value e1?我有类似的东西 但我不知道在哪里声明和设置@value1??

  • 本文向大家介绍let和const的区别是什么相关面试题,主要包含被问及let和const的区别是什么时的应答技巧和注意事项,需要的朋友参考一下 let和const都是es6引入的新的关键字,let主要解决的是var变量提升导致的全局变量污染问题,let是块级作用域,var是函数作用域,const和let功能一样只是多了一个不可更改的修饰,项目中我们应该多使用const,避免使用var。

  • 着色器语言和C语言、javascript语言一样可以通过关键字const声明一个常量。 着色器语言和其它语言一样,声明一个变量,可以重新赋值,如果通过关键字const声明一个常量,顾名思义是常量,在代码中是不可以更改的。 // 着色器语言定义一个整形常量 const int count = 10; // 定义一个浮点数常量10.0 const float count = 10.0; // 定义一个