乐趣区

前端学习笔记(二)闭包是什么?

闭包在 ECMAScript 解释
闭包,指的是词法表示包括不被计算的变量的函数,也就是说,函数可以使用函数之外定义的变量。地址:https://www.w3cschool.cn/ecma…
下面说一下我自己对闭包的理解
什么样的代码叫做闭包
下面是一个简单的闭包代码
var name = ‘ 张三 ’

function sayName() {
console.log(name);
}

// 执行
sayName(); // 张三
个人理解:只要函数内使用了不是函数内定义的变量,这个函数就称之为“闭包”。因为在函数载入内存时,不清楚 name 正正的值,直到在执行时才直到 name 具体的值。
一个复杂一些的例子
一个购物车的函数,函数内有 商品数量 的变量和 购买 的闭包
// 购物车
function shoppingCart() {
var goodsNum = 0
// 购买
function buy() {
goodsNum++
console.log(‘ 当前商品数量:’ + goodsNum)
}
return buy
}

var buy = shoppingCart()

buy(); // 当前商品数量: 1
buy(); // 当前商品数量: 2
buy(); // 当前商品数量: 3
执行后发现程序会一直保留商品数量的变量,因为引用的是函数外部的变量,不清楚变量具体的值,所以变量一直不会被释放。这样的话在做个例子。
通过下面的例子总结一下:下面这段代码,buy 这个函数是一个闭包,因为它引用了内部以外的变量。再把这个函数赋值给多个变量执行时,会依次创建多个闭包引入的变量副本,并且相互不会污染。
// 购物车
function shoppingCart() {
var goodsNum = 0
// 购买
function buy() {
goodsNum++
console.log(‘ 当前商品数量:’ + goodsNum)
}
return buy
}

var tomBuy = shoppingCart()
var jackBuy = shoppingCart()

tomBuy(); // 当前商品数量: 1
jackBuy(); // 当前商品数量: 1

tomBuy(); // 当前商品数量: 2
jackBuy(); // 当前商品数量: 2

tomBuy(); // 当前商品数量: 3
jackBuy(); // 当前商品数量: 3

函数内引用了外部的变量,这个函数称为闭包
闭包内引入的变量不会被释放,会一直保留状态
闭包赋给多个变量执行,每个闭包内的变量状态,相互不会污染

下一篇使用闭包的特点,做个实际开发中的例子。

退出移动版