我已经玩ES6一段时间了,我注意到虽然声明的变量var按预期提升了......
console.log(typeof name); // undefined
var name = "John";
Run Code Online (Sandbox Code Playgroud)
... 用吊装声明let或const似乎有一些问题的变量:
console.log(typeof name); // ReferenceError
let name = "John";
Run Code Online (Sandbox Code Playgroud)
和
console.log(typeof name); // ReferenceError
const name = "John";
Run Code Online (Sandbox Code Playgroud)
这是否意味着变量声明let或未声明const?这是怎么回事?这个问题let和const这个问题有什么区别吗?
在Javascript中,我可以做
> var foo;
< undefined
> foo;
< undefined
Run Code Online (Sandbox Code Playgroud)
这表明在 Javascript 中,声明的未初始化变量始终是undefined。但他们是吗?或者它们可以像 C 中那样采用随机垃圾值吗?
MDN 的 var 文档没有帮助。
请在下图中找到代码.1.将函数的返回值(实际上抛出一个错误)分配给使用关键字"let"声明的变量'withLet'.2.调用'withLet',发生错误:'withLet未定义'.3.尝试使用'let'断言'withLet',错误显示已经声明'withLet'.
但是'var'不存在悖论(请参见下图).
我很好奇是什么导致了这两种情况之间的不同行为.它是非常有线的,"未定义","已经声明"描述了一个相同的变量.
let withLet = (function() {throw 'error!'})()
var withVar = (function() {throw 'error!'})()
//VM2470:1 Uncaught error!
//(anonymous) @ VM2470:1
//(anonymous) @ VM2470:1
withLet
//VM2484:1 Uncaught ReferenceError: withLet is not defined at
//<anonymous>:1:1
//(anonymous) @ VM2484:1
withVar
//undefined
let withLet = 'sth'
//VM2520:1 Uncaught SyntaxError: Identifier 'withLet' has already been
//declared
//at <anonymous>:1:1
//(anonymous) @ VM2520:1
withVar = 'sth'
//"sth"
Run Code Online (Sandbox Code Playgroud)
截图:

我在多个网站(如 w3schools)上读到过,提升是“将所有声明移动到当前范围顶部的行为”。
对于letand const,变量被提升但没有初始化。
我理解为什么以下代码不起作用,因为name它对我们没有访问价值。
console.log(name);
let name = "hi";Run Code Online (Sandbox Code Playgroud)
但是为什么我们不能name在实际声明之前为其赋值,即使name已经声明(提升)?
name = "hi";
let name;
console.log(name);Run Code Online (Sandbox Code Playgroud)
上面的代码是不是和下面的一样,
let name;
name = "hi";
console.log(name);Run Code Online (Sandbox Code Playgroud)
我对JS中的Set类型感到困惑。如果使用未正确初始化的Set创建变量,则不能再使用它(作为Set或原始类型)。在控制台中尝试:
let someSet = new Set(4);
/* Uncaught TypeError: number 4 is not iterable (cannot read property Symbol(Symbol.iterator))
at new Set (<anonymous>)*/
someSet
// Uncaught ReferenceError: someSet is not defined
let someSet = new Set([4])
// Uncaught SyntaxError: Identifier 'someSet' has already been declared
someSet
// Uncaught ReferenceError: someSet is not defined
let someSet = 'ho-ho-ho'
// Uncaught SyntaxError: Identifier 'someSet' has already been declared
someSet = 'ho-ho-ho'
// Uncaught ReferenceError: someSet is not defined
Run Code Online (Sandbox Code Playgroud)
你能解释一下为什么吗?见屏幕: