再谈JavaScript中的闭包
一、什么是闭包
闭包就是有权访问另一个函数作用域中变量的函数,因此,闭包的本质是一个函数。当一个内部函数被保存到外部时,就会生成闭包。
二、闭包的作用
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中的闭包的更多相关文章
- 浅谈JavaScript中的闭包
浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...
- 再谈JavaScript的closure--JavaScript 闭包
关于JavaScript的闭包,在我的博客上之前有一篇文章 https://www.cnblogs.com/wphl-27/p/8491327.html 今天看了几篇文章,感觉又有了一些更深的理解,特 ...
- 【一次面试】再谈javascript中的继承
前言 面向对象编程是每次面试必问的知识点,而前端js如何实现继承每次命中率高达80% 这不,近两天我们面试时候,同事就问道面试者此问题,但是,不论之前自己做的回答,还是面试者的回答,基本都不太令人满意 ...
- 让你分分钟学会Javascript中的闭包
Javascript中的闭包 前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它 ...
- Javascript中的闭包(转载)
前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.下面是作者从作用域链慢慢讲到 ...
- 狗日的Javascript中的闭包
前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.下面是作者从作用域链慢慢讲到 ...
- javascript中的闭包解析
学习javaScript已经有一段时间了,在这段时间里,已经感受到了JavaScript的种种魅力,这是一门神奇的语言,同时也是一门正在逐步完善的语言,相信在大家的逐步修改中,这门语言会逐步的完善下去 ...
- 浅谈JS中的闭包
浅谈JS中的闭包 在介绍闭包之前,我先介绍点JS的基础知识,下面的基础知识会充分的帮助你理解闭包.那么接下来先看下变量的作用域. 变量的作用域 变量共有两种,一种为全局变量,一种为局部变量.那么全局变 ...
- JavaScript中的闭包理解
原创文章,转载请注明:JavaScript中的闭包理解 By Lucio.Yang 1.JavaScript闭包 在小学期开发项目的时候,用node.js开发了服务器,过程中遇到了node.js的第 ...
随机推荐
- python 基础 元组()
# 元组 应用场景 # 尽管 Python的列表中可以存储不同类型的数据 # 但是在开发中,更多的应用场景是 # 1.列表存储相同类型的数据 # 2.通过迭代遍历,在循环体内部,针对列表中的每一项元素 ...
- java学习第05天(数组常见操作、数组中的数组)
(4)数组常见操作 a.遍历取值 class ArrayDemo3 { public static void main(String[] args) { //System.out.println(&q ...
- ffmpeg 合并aac格式音频文件
1:连接到一起 'ffmpeg - i "concat:D:\learn\audio\1.aac|D:\learn\audio\2.aac" - acodec copy D:\le ...
- TensorFlow 从零到helloWorld
目录 1.git安装与使用 1.1 git安装 1.2 修改git bash默认路径 1.3 git常用操作 2.环境搭建 2.1 tensorflow安装 2.2 CUDA安装 2.3 ...
- gitminer
https://github.com/UnkL4b/GitMiner + Autor: UnK + Blog: https://unkl4b.github.io + Github: https://g ...
- linux定时器【转】
转自:http://www.cnblogs.com/processakai/archive/2012/04/11/2442294.html 今天看书看到了关于alarm的一些用法,自己有在网上找了些资 ...
- Linux中断(interrupt)子系统之五:软件中断(softIRQ)
转自:http://blog.csdn.net/droidphone/article/details/7518428 软件中断(softIRQ)是内核提供的一种延迟执行机制,它完全由软件触发,虽然说是 ...
- mac lsof使用查看端口
安装 brew install lsof 在Mac OS系统中,无法使用netstat来查看端口占用情况,可以使用lsof来代替,这种方式在Linux下也适用. sudo lsof -nP -iTCP ...
- 细说MySQL备份的基本原理(系列一 ) 备份与锁
数据库作为一个系统中唯一或者主要的持久化组件,对服务的可用性和数据的可靠性要求极高. 作为能够有效应对因为系统软硬件故障.人工误操作导致数据丢失的预防手段,备份是目前最为常见的数据库运维操作. 考虑到 ...
- jdk windows环境变量
(1)新建->变量名"JAVA_HOME",变量值"C:\Java\jdk1.8.0_05"(即JDK的安装路径) (2)编辑->变量名" ...