javascript 闭包以及let和var的一点点思考

let和var的区别

let新特性

1.不存在变量提升(变量声明之前赋值报错,var为undefined)

2.存在暂时性死区(let变量一旦被声明,就会存在一个封闭的绑定的区域,无法再次被绑定,我们称之为“暂时性死区”)

3.不允许重复声明

4.具有块级作用域

5.块级作用域和函数声明(允许在块级作用域声明内部函数,其声明方式性质和let一样)

JavaScript 闭包

闭包就是将函数作为返回值返回,返回的函数并不会立即执行。

例子(参考廖老师js教程:https://www.liaoxuefeng.com/wiki/1022910821149312/1023021250770016):

function count() {
  var arr = [];
  for (var i=1; i<=3; i++) {
    arr.push(function () {
      return i * i;
    });
  }
  return arr;
}

var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];

console.log(f1)
console.log(f2)
console.log(f3)

console.log(f1())
console.log(f2())
console.log(f3())

本例中将arr里推入函数作为返回值调用,返回的是函数而不是具体数值。执行这些函数需要f()这样。如果直接打印f。结果为:

上例结果应该是:

 what???我好不容易理解了闭包,全是16,不对吧,

确实是这样的,原因是i作为test函数的以var声明的变量值,i就相当于返回值函数们的共享变量,返回时没有立即执行,所以等到执行是i变为了4,故全是16. 这一点我们可以采用立即执行函数来获得正确的结果,如:

function count() {
  var arr = [];
  for (var i=1; i<=3; i++) {
    arr.push((function () {
      return i * i;
    })(i));
  }
  return arr;
}

var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];

console.log(f1)
console.log(f2)
console.log(f3)

 立即执行函数就是在匿名函数外加一个括号然后后面加一个括号以及变量,这样函数就会立即执行。

但是我们今天讨论用let,把上面的代码用let换掉,可以发现。不需要立即执行函数。

function count() {
  let arr = [];
  for (let i=1; i<=3; i++) {
    arr.push(function () {
      return i * i;
    });
  }
  return arr;
}

let results = count();
let f1 = results[0];
let f2 = results[1];
let f3 = results[2];

console.log(f1)
console.log(f2)
console.log(f3)

console.log(f1())
console.log(f2())
console.log(f3())

结果为:

 这就是let暂时性死区,let声明之后就绑定的区域无法重复声明,所以let i是在不同区域进行操作,let i的变化也是在之前的结果基础之上进行递增的,所以就避免了这个问题。

还是有意思的哈,哈哈哈

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值