JS 中 var 和 let 的区别小结

let 和 const 是 ES6 中新增的声明对象的类型。

与 var 相比,let 和 const 不存在变量提升。变量提升,指的是在变量声明之前就可以使用,只是,在声明之前,变量的值为undefined。var 声明的变量,在全局范围内都有效,而 let 声明的变量,只在 let 所在的作用域内有效。如以下 for 循环:

for(var i = 0; i < 10; i++) {
    console.log(i)
}
console.log(i); // 10

在上述代码中,一般情况下,我们期望的是,报错,i is not defined。但是,由于在 for 循环内,i 是用 var 声明的,导致 i 在全局范围内都有效,所以输出 10. 要想避免这种情况,则应该使用 let ,使得 i 只在循环体内有效。

let 还有一个特点,就是会将所声明的变量绑定与let所在的作用域,不受作用域外变量的影响。

var a = 1;
if (true) {
    a = 2; // 报错,a is not defined
    let a;
}

上述代码,在 if 语句内部对 a 赋值,会报错,即使已经在外部定义了 var a。所以,在一个作用域内,在 let 声明一个变量前,都不能操作该变量。这种现象在语法上称之为“暂时性死区”(temporal dead zone,简称TDZ)。

现在再来看看我上篇文章提到的那个题目:

function a() {
    return foo;
    var foo = 1;
}
function b() {
    return foo;
    let foo = 1;
}
console.log(a()); // undefined
console.log(b()); // 报错 ReferenceError: foo is not defined

第一个函数,在创建活动对象的时候,可以创建被 var 声明的 foo,只是此时返回的是 undefined。

第二个函数,在创建活动对象的时候,不能收集被 let 声明的 foo,因为在 let 存在的作用域内,在 let 声明前,不能操作被 let 声明的对象。

再来看一种情况:

function a() {
  return foo;
  let foo = 1; // 报错 SyntaxError: Identifier 'foo' has already been declared
  function foo() { };
}
console.log(a());

上述代码,在创建活动变量的时候,会报错。创建活动变量的细节在上一篇文章中。报错的原因是,不允许使用 let 重复声明变量。而使用 var 就不会有这种限制。

function a() {
  var foo = 1;
  var foo = function () { };
  return foo;
}
console.log(a()); // function......

 

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值