一、什么是闭包

闭包就是有权访问另一个函数作用域中变量的函数,因此,闭包的本质是一个函数。当一个内部函数被保存到外部时,就会生成闭包。

二、闭包的作用

1、实现公有变量,即通过局部变量实现全局变量的效果

案例:定义一个函数,每调用 一次数字累加一次,即计数器效果

//非闭包实现
var num = 0;
function count() {
console.log(++num);
}
count(); //
count(); //
count(); //
//闭包实现
function count() {
var num = 0;
function add() {
console.log(++num);
}
return add;
}
var myCount = count();
myCount(); // 1
myCount(); //
myCount(); //

2、实现缓存,即多个函数可同时操作一个局部变量

function demo() {
var fruit = 'apple';
var obj = {
eatFruit: function() {
if (fruit != '') {
console.log('eat => ' + fruit);
fruit = '';
} else {
console.log('empty');
}
},
pushFruit: function(myFruit) {
fruit = myFruit;
}
}
return obj;
}
var boy = demo();
boy.eatFruit(); // eat => apple
boy.eatFruit(); // empty
boy.pushFruit('grape');
boy.eatFruit(); // eat => grape

3、实现封装属性私有化

也就是对象无法直接访问函数内部定义的同级变量,只能通过对象相应的方法来操作变量,仍以上一代码为例

function demo() {
var fruit = 'apple';
var obj = {
eatFruit: function() {
if (fruit != '') {
console.log('eat => ' + fruit);
fruit = '';
} else {
console.log('empty');
}
},
pushFruit: function(myFruit) {
fruit = myFruit;
}
}
return obj;
}
var boy = demo();
console.log(boy.fruit); // undefined

无法通过 对象点变量名 的方式直接访问变量,只能通过对象内部封装的方法来操作变量

4、模块化开发,防止污染全局变量

var demo = '全局内demo';

var init = (function(){
var demo = 'init局部内demo';
function show() {
console.log(demo);
}
return function() {
show();
}
}()); init(); // init局部内demo var test = (function(){
var demo = 'test局部内demo';
function show() {
console.log(demo);
}
return function() {
show();
}
}()) test(); // test局部内demo

init和test为独立模块,执行 init 和 test 函数后只会输出内部同名变量,不会影响全局同名变量。

三、闭包的害处

闭包会导致原有作用域链不释放,造成内存泄露,过多闭包会严重影响运行速度

再谈JavaScript中的闭包的更多相关文章

  1. 浅谈JavaScript中的闭包

    浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...

  2. 再谈JavaScript的closure--JavaScript 闭包

    关于JavaScript的闭包,在我的博客上之前有一篇文章 https://www.cnblogs.com/wphl-27/p/8491327.html 今天看了几篇文章,感觉又有了一些更深的理解,特 ...

  3. 【一次面试】再谈javascript中的继承

    前言 面向对象编程是每次面试必问的知识点,而前端js如何实现继承每次命中率高达80% 这不,近两天我们面试时候,同事就问道面试者此问题,但是,不论之前自己做的回答,还是面试者的回答,基本都不太令人满意 ...

  4. 让你分分钟学会Javascript中的闭包

    Javascript中的闭包 前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它 ...

  5. Javascript中的闭包(转载)

    前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.下面是作者从作用域链慢慢讲到 ...

  6. 狗日的Javascript中的闭包

    前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.下面是作者从作用域链慢慢讲到 ...

  7. javascript中的闭包解析

    学习javaScript已经有一段时间了,在这段时间里,已经感受到了JavaScript的种种魅力,这是一门神奇的语言,同时也是一门正在逐步完善的语言,相信在大家的逐步修改中,这门语言会逐步的完善下去 ...

  8. 浅谈JS中的闭包

    浅谈JS中的闭包 在介绍闭包之前,我先介绍点JS的基础知识,下面的基础知识会充分的帮助你理解闭包.那么接下来先看下变量的作用域. 变量的作用域 变量共有两种,一种为全局变量,一种为局部变量.那么全局变 ...

  9. JavaScript中的闭包理解

    原创文章,转载请注明:JavaScript中的闭包理解  By Lucio.Yang 1.JavaScript闭包 在小学期开发项目的时候,用node.js开发了服务器,过程中遇到了node.js的第 ...

随机推荐

  1. [C]语法, 知识点总结(一. 进制, 格式化输入/出, 指针)

    进制 概念: n进制, 最大的数是n-1, 逢n进1位. 数据类型 概念: 其实就是占的位数不同, 转换到计算机当中都是0和1. 常用: 类型名 占字节数 描述 char 1字节=8个二进制位 字符类 ...

  2. 小议 html 实体解析

    今天分享个小技巧,是群里一个朋友问的,"请问 + 这种类型的字符串怎么转换成我们想要的字符 + ,有什么简便的js方法吗"其实问题说简单也简单,说难也难.我们要分情况来描述问题解决 ...

  3. 用U盘安装 win7 ”找不到任何设备驱动程序“ 和 系统出现 windows boot manager 解决方案

    用U盘安装win7系统时,系统交替的出现了如下的2个错误,捣鼓了半天,记录下来: 问题1描述: 安装win7时  ”找不到任何设备驱动程序“  问题2描述: 安装win7时,用U盘启动后, 系统出现 ...

  4. spring如何管理mybatis(二) ----- SqlSession的线程安全性

    在之前的文章中我们了解到最终的数据库最终操作是走的代理类的方法: @Override public Object invoke(Object proxy, Method method, Object[ ...

  5. 【Python】exe2shellcode,shellcode2exe

    用python写这类程序真简洁,要是用C++又不知道得多写多少行代码了. exe2shellcode #! /usr/bin/env python # -*- coding: utf-8 -*- im ...

  6. 奈奎斯特定理 and 香农定理

    -----------------------整理自<21ic电子网> 奈奎斯特定理(Nyquist's Theorem)和香农定理(Shannon's Theorem)是网络传输中的两个 ...

  7. brotli压缩

    brotli压缩 https://www.cnblogs.com/shanyou/p/9154816.html Brotli是一种全新的数据格式,可以提供比Zopfli高20-26%的压缩比.据谷歌研 ...

  8. php ++测试

    2014年4月27日 12:17:47 结论暂时没有组织语言去表述,但是看看测试结果大家都会明白的 $x = 1; $y = empty($x) ? 3 : $x++; var_dump($x,$y) ...

  9. 浅谈js设计模式之代理模式

    代理模式是一种非常有意义的模式,在生活中可以找到很多代理模式的场景.比如,明星都有经纪人作为代理.如果想请明星来办一场商业演出,只能联系他的经纪人.经纪人会把商业演出的细节和报酬都谈好之后,再把合同交 ...

  10. Laravel 的 JSON API 接口自动化测试

    Laravel 自带了两种测试类型 Feature Test: 功能测试.针对类似接口这种流程性的测试. Unit Test: 单元测试.针对单个函数这种输入输出结果的测试. 新建一个 Feature ...