再谈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的第 ...
随机推荐
- MySql数据库资料收集
1.下载MySQL历史版本 https://downloads.mysql.com/archives/community/ https://downloads.mysql.com/archives/i ...
- P4549 【模板】裴蜀定理
题目描述 给出n个数(A1...An)现求一组整数序列(X1...Xn)使得S=A1X1+...AnXn>0,且S的值最小 输入输出格式 输入格式: 第一行给出数字N,代表有N个数 下面一行给出 ...
- 爬虫笔记之自如房屋价格图片识别(价格字段css背景图片偏移显示)
一.前言 自如房屋详情页的价格字段用图片显示,特此破解一下以丰富一下爬虫笔记系列博文集. 二.分析 & 实现 先打开一个房屋详情页观察一下: 网页的源代码中没有直接显示价格字段,价格的显示是使 ...
- 基于滑动窗口协议写的程序(UDP实现) .
正好有一个大作业关于用socket实现滑动窗口协议,所以写了一个,模拟接收方与发送方窗口都是2,用两个线程实现. 下面是代码,注释的比较详细了. socket_udp.h #include<st ...
- git学习——Git 基础要点【转】
转自:http://blog.csdn.net/zeroboundary/article/details/10549555 简单地说,Git 究竟是怎样的一个系统呢?请注意,接下来的内容非常重要,若是 ...
- jquery-扩展
jQuery扩展三种方式:$.extend,$.fn.extend,外部文件. 1)jQuery.extend(object) 调用 $.方法 2)jQuery.fn.extend(object) ...
- Android WebView 详解
相关API 相关类介绍 WebResourceRequest 添加于API21,封装了一个Web资源的请求信息,包含:请求地址,请求方法,请求头,是否主框架,是否用户点击,是否重定向 WebResou ...
- css实现导航切换
css实现导航切换 效果图: 代码如下,复制即可使用: <!DOCTYPE html> <html> <head> <title>css实现导航切换&l ...
- js中ajax异步问题
1.JS的执行顺序问题 浏览器是按照从上到下的顺序解析页面,因此正常情况下,JavaScript脚本的执行顺序也是从上到下的,即页面上先出现的代码或先被引入的代码总是被先执行,即使是允许并行下载Jav ...
- vscodes使用(一): 常用插件,在线与离线安装
一.常用插件 1.Live server 浏览器实时刷新 插件安装成功后,会在底部工具栏中,显示个Go Live *.html文件,点击右键,可以看到live server两条指令 2.Esasy ...