JavaScript 使用 let 的块作用域

JavaScript blockscope with let

我修改了下面给出的 MDN website 的原始脚本。

  1. var 的类型是什么?是给变量赋值后才赋值的类型

  2. 是否var b = 1覆盖了之前的语句var b = 10?或者只是变量 b?

  3. let 是一个非标准的语言特性吗?我读到 here ECMAScript 6 支持它。

var a = 5;
var b = 10;

if (a === 5) {
  let a = 4; // The scope is inside the if-block
  var b = 1; // The scope is inside the function

  alert(a);  // 4
  alert(b);  // 1
} 

alert(a); // 5
alert(b); // 1

  1. 是的,var x没有类型。 var x = 1 的类型为 number
  2. var b 不会覆盖其他语句,它只是为给定范围设置一个新变量。这意味着在该范围内,您将获得 b 的新分配值。
  3. let 是 es6。所以是和否,取决于你的代码在哪里 运行.

What is the type of var?

var 没有类型。它是一个keyword用来声明变量。

Is the type assigned only after a value is assigned to a variable?

当你声明一个变量但不给它赋值时,它的值将是undefined, whose type is Undefined.

Does var b = 1 overwrite the previous statement var b = 10? Or just the variable b?

变量语句被提升到顶部。这意味着它们是等价的:

// ...
var b = 10;
if(cond) var b = 1;
var b;
// ...
b = 10;
if(cond) b = 1;

因此,由于 b 已经声明,var b = 1 将等同于 b = 1

Is let a non-standard language feature? I read here that it is supported in ECMAScript 6.

let 是在 JavaScript 1.7 中引入的,当时还不是任何 ECMA-262 标准的一部分。

现在 ECMAScript 6 已经对其进行了标准化(与 JS 1.7 有点不同)。但是,请注意 ECMAScript 6 仍是草案。