var和let的区别,使用闭包解决var的函数作用域问题

1 篇文章 0 订阅
1 篇文章 0 订阅

一、var和let的区别

varlet
函数作用域块作用域
在函数内声明了var,整个函数内都是有效的,在for循环内定义了一个var变量,实际上其在for循环以外也是可以访问的let由于是块作用域,所以如果在块作用域内(for循环内)定义的变量,在其外面是不可被访问
会默认成为window的一个属性不会添加到window对象中
声明带有var关键字的变量会为该变量创建单个绑定(存储空间)使用 let 声明一个具有块级作用域的变量,则为每个循环迭代创建一个新的绑定

二、用var和let声明变量的实例

例1:用var进行声明

在for循环的头部声明带有var关键字的变量会为该变量创建单个绑定(存储空间)。

var array = [];
for (var i = 0; i < 3; i++) {
    // 三个箭头函数体中的每个`'i'`都指向相同的绑定,
    // 这就是为什么它们在循环结束时返回相同的值'3'。
    array.push(() => i);
}
var newArray = array.map(el => el());
console.log(newArray); // [3, 3, 3]
  • 误解作用域:认为存在块级作用域(x)

例2:用let进行声明

如果使用 let 声明一个具有块级作用域的变量,则为每个循环迭代创建一个新的绑定

// 使用ES6块级作用域
var array = [];
for (let i = 0; i < 3; i++) {
    // 这一次,每个'i'指的是一个新的的绑定,并保留当前的值。
    // 因此,每个箭头函数返回一个不同的值。
    array.push(() => i);
}
var newArray = array.map(el => el());
console.log(newArray); // [0, 1, 2]

例3:闭包

解决这个问题的另一种方法是使用闭包。

let array = [];
for (var i = 0; i < 3; i++) {
    array[i] = (function(x) {
        return function() {
            return x;
        };
    })(i);
}
const newArray = array.map(el => el());
console.log(newArray); // [0, 1, 2]

三、扩展:闭包

1、特点:

  • 闭包是一个函数,而且存在于另一个函数当中
  • 闭包可以访问到父级函数的变量,且该变量不会销毁
  • 缓存数据,延长作用域
 //闭包的实现
	function fn(){
		var n = 1;
		//将test这个函数返回
		return function(){
		n++;
		console.log(n);
		}
	}
	var resFn = fn();//将fn调用完成的返回值保存到变量resFn中
	resFn();//2
	resFn();//3
	resFn();//4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值