博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入理解js闭包
阅读量:6858 次
发布时间:2019-06-26

本文共 1288 字,大约阅读时间需要 4 分钟。

前言:写这篇文章是因为我面试栽在了这个问题上,说起来可笑,我一直觉得自己对这个问题理解的很透彻,其实诶!!!!。闲话不多说,希望大家看完之后有所收获不再栽跟头。。

题目:一句话说明什么是闭包?

说法一:闭包是指有权访问另外函数作用域中的变量的函数。---《js高级程序设计》函数表达式章节的解释。

说法二:闭包是函数和声明该函数的词法环境的组合。这个环境包含了这个闭包创建时所能访问的所有局部变量---《MDN网站的解释》(官方)

说法三:通俗一点讲,就是一个函数里面声明的内部函数,这个内部函数有权访问它外部函数的环境变量。(不够严谨)

闭包的特点:

1、闭包就是能够读取其他函数内部变量的函数,函数没有被释放,整条作用域链上的局部变量都将得到保留

2、用闭包模拟私有方法

引入MDN网站代码的例子说明,代码如下

var makeCounter = function() {  var privateCounter = 0;  function changeBy(val) {    privateCounter += val;  }  return {    increment: function() {      changeBy(1);    },    decrement: function() {      changeBy(-1);    },    value: function() {      return privateCounter;    }  }  };var Counter1 = makeCounter();var Counter2 = makeCounter();console.log(Counter1.value()); /* logs 0 */Counter1.increment();Counter1.increment();console.log(Counter1.value()); /* logs 2 */Counter1.decrement();console.log(Counter1.value()); /* logs 1 */console.log(Counter2.value()); /* logs 0 */复制代码

上述代码中分别两次引用了makeCounter,生成的两个计数器。这两个计数器就是两个闭包,他们具有各自的独立性。每个闭包都是引用自己词法作用域内的变量 privateCounter 。以这种方式使用闭包,提供了许多与面向对象编程相关的好处 —— 特别是数据隐藏和封装。

关于性能方面的考量

如果不是某些特定任务需要使用闭包,在其它函数中创建函数是不明智的,因为闭包在处理速度和内存消耗方面对脚本性能具有负面影响。

例如,在创建新的对象或者类时,方法通常应该关联于对象的原型,而不是定义到对象的构造器中。原因是这将导致每次构造器被调用时,方法都会被重新赋值一次(也就是,每个对象的创建)。

转载于:https://juejin.im/post/5c96f8f4e51d457f682c6d99

你可能感兴趣的文章
配置MSTP及负载均衡
查看>>
高可用高并发的 9 种技术架构!
查看>>
2018-06-11笔记(日常运维二)
查看>>
top -bcn -1
查看>>
定时任务
查看>>
一条数据的漫游 -- X-Engine SIGMOD Paper Introduction
查看>>
从头开始复习css之2D变换
查看>>
研究生之路
查看>>
将军令:数据安全平台建设实践
查看>>
2017年软件工程第八次作业-每周PSP例行报告
查看>>
《python 编程从入门到实践》操作列表与if语句
查看>>
Android 代码混淆 混淆方案
查看>>
「小程序JAVA实战」小程序视频封面处理(48)
查看>>
8.ES6测试
查看>>
Spring整合JUnit4测试使用注解引入多个配置文件
查看>>
转 原生js中的this指向四条定律
查看>>
centos7 开启防火墙端口 firewalld
查看>>
day25 Python
查看>>
linux影响上传文件大小的因素
查看>>
密码爆破脚本
查看>>