资讯专栏INFORMATION COLUMN

前端学习日记(二)javascript基础:闭包是什么?

flybywind / 3208人阅读

摘要:闭包在解释闭包,指的是词法表示包括不被计算的变量的函数,也就是说,函数可以使用函数之外定义的变量。再把这个函数赋值给多个变量执行时,会依次创建多个闭包引入的变量副本,并且相互不会污染。

闭包在 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

函数内引用了外部的变量,这个函数称为闭包

闭包内引入的变量不会被释放,会一直保留状态

闭包赋给多个变量执行,每个闭包内的变量状态,相互不会污染

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/103281.html

相关文章

  • 我的前端面试日记(一)

    摘要:组件化编码的一切都是基于组件的。属性返回目标节点的前一个兄弟节点。如果目标节点前面没有同属于一个父节点的节点,将返回属性是一个只读属性。而当变量离开环境时,则将其标记为离开环境。 第一次写面试经历,虽然之前有过一些电话面试经历,但相对而言感觉此次的经历对自己收获还是比较大,这里留下面经当作日记吧!(面试时间:2018-6-12 下午2:10;时长:50min;公司:*) 1、说说Rea...

    warkiz 评论0 收藏0
  • 我的前端面试日记(一)

    摘要:组件化编码的一切都是基于组件的。属性返回目标节点的前一个兄弟节点。如果目标节点前面没有同属于一个父节点的节点,将返回属性是一个只读属性。而当变量离开环境时,则将其标记为离开环境。 第一次写面试经历,虽然之前有过一些电话面试经历,但相对而言感觉此次的经历对自己收获还是比较大,这里留下面经当作日记吧!(面试时间:2018-6-12 下午2:10;时长:50min;公司:*) 1、说说Rea...

    zhunjiee 评论0 收藏0
  • 我的前端面试日记(一)

    摘要:组件化编码的一切都是基于组件的。属性返回目标节点的前一个兄弟节点。如果目标节点前面没有同属于一个父节点的节点,将返回属性是一个只读属性。而当变量离开环境时,则将其标记为离开环境。 第一次写面试经历,虽然之前有过一些电话面试经历,但相对而言感觉此次的经历对自己收获还是比较大,这里留下面经当作日记吧!(面试时间:2018-6-12 下午2:10;时长:50min;公司:*) 1、说说Rea...

    hightopo 评论0 收藏0
  • 前端学习日记(一)javascript基础:变量的作用域

    摘要:张三李四李四李四链式作用域函数包含在函数中,这是函数所有局部变量对函数可见,但是相反是不行的。局部变量必须使用声明,否则声明的是全局变量。父级函数变量对所有子函数可见,子函数会一级一级向上寻找变量。 引言 一直从事服务端开发。由于近年来前端迅速发展,所以想入坑前端行列,虽然一直有接触并开发前端相关的项目,但是想要做前端的工作决定系统的学习一下前端,就先从变量开始吧! 变量的作用域 在j...

    rollback 评论0 收藏0
  • 前端面试日记

    摘要:面试时间晚上时长小时分钟公司,一面一简单的介绍下自己介绍的真的很简单。。。。。。二平时都是怎么学习前端的学习前端的话,我主要是以书籍为主然后是网站视频博客文档等学习理论,之后再通过代码实践。。。 大概是在6月11号在Boss直聘投的简历,6月12号中午收到电话约的面试时间,刚开始说是13号晚上7点;后面可能时间有变,中午来了个电话说改到9-10点;怎么说算是第一次面试自己目标公司之一吧...

    huayeluoliuhen 评论0 收藏0

发表评论

0条评论

flybywind

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<