Javascript var/let/const 变量初始化

Posted

技术标签:

【中文标题】Javascript var/let/const 变量初始化【英文标题】:Javascript var/let/const variable initialization 【发布时间】:2021-10-19 23:29:38 【问题描述】:

这里是javascript新手。 来自https://www.freecodecamp.org/news/var-let-and-const-whats-the-difference/ :

它们都被吊到了其范围的顶部。但是虽然 var 变量用 undefined 初始化,let 和 const 变量是 未初始化。 虽然 var 和 let 可以声明而不是 已初始化,const 必须在声明期间初始化。

所以“const”很明显它被初始化为它最初声明的值。

“变量”:

a) not declared, initialized as undefined
b) declared, initialized accordingly

“让”:

a) not declared, initialized as ______???______
b) declared, initialized accordingly

什么是“let”初始化,就好像它一开始没有声明一样?

【问题讨论】:

"什么是 "let" 初始化,就好像它一开始没有声明一样?" 什么都没有。它无法使用。如果您尝试读取或写入该变量,您将进入the temporal dead zone 并且您会收到错误消息。另见:Are variables declared with let or const hoisted? 请注意,虽然“用 let 和 const 声明的变量也会被提升”,“直到它们被初始化的那一行被执行,任何访问这些变量的代码都会抛出异常”。 developer.mozilla.org/en-US/docs/Glossary/Hoisting 我的建议:1) 永远不要使用var。如果可能,将其从现有代码中重构出来。 2) 如果值不会改变,请始终使用const。例如,如果您创建一个数组以稍后将元素推入其中,则该数组仍然可以是const,因为它是一个不会更改的引用。 3) 仅当您确定变量会更改时才使用let。例如,for 循环索引。 4) 将constlet 声明放在尽可能靠近它们使用的位置,就像在其他编程语言中一样,并且忘记它们的提升。 (续)如果某些代码在声明之前尝试使用它们,您将在运行时收到错误消息。 5) 使用 JSDoc 类型提示或 TypeScript。 JSDoc 可以在 Visual Studio Code 等编辑器中创造奇迹,因为编辑器会显示每个与类型相关的错误,即使在纯 JavaScript 代码中也是如此。此外,编辑器将在声明之前显示何时使用值,因此您根本不必考虑提升。 【参考方案1】:

let 如果已声明但未初始化,则其默认值设置为 undefined

let x;
console.log(x);

>> undefined

【讨论】:

问题是if not declared, to what it is initialized @Sirode 你会看到一个错误:Uncaught ReferenceError: x is not definedfiddle【参考方案2】:

好吧,考虑它的最简单方法是只有一种类型的未声明变量(在从未声明的意义上,否则你只会得到一个ReferrenceError)。如果它从不声明,则 JavaScript 引擎不能选择将其设为 varletconst 以满足开发人员的需求。

因此,任何从未声明的变量使用都会变成var。而var 被初始化为undefined

注意:似乎有人不同意,但没有花时间解释原因。我很高兴了解我的错误并提高我的知识。

【讨论】:

【参考方案3】:

提升的let 变量被初始化为一个特殊的“值”,在访问时会抛出一个ReferenceError

function foo() 
    console.log(x)  // ReferenceError: Cannot access 'x' before initialization
    let x


foo()

let 和 const 声明定义了范围为正在运行的执行上下文的 LexicalEnvironment 的变量。在评估变量的 LexicalBinding 之前,不得以任何方式访问变量 ...。

https://tc39.es/ecma262/multipage/ecmascript-language-statements-and-declarations.html#sec-let-and-const-declarations

【讨论】:

以上是关于Javascript var/let/const 变量初始化的主要内容,如果未能解决你的问题,请参考以下文章

var let const 区别

var let const 区别

javascript精雕细琢:var let const function声明的区别

javascript中var let const三种变量声明方式

小程序里let和var以及const区别

javaScript 变量提升 var let const,以及JS 的解析阶段和执行阶段