Javascript闭包用法实例分析


Posted in Javascript onJanuary 23, 2015

本文实例分析了Javascript闭包的概念及用法。分享给大家供大家参考。具体如下:

提到闭包,想必大家都早有耳闻,下面说下我的简单理解。
说实话平时工作中实际手动写闭包的场景并不多,但是项目中用到的第三方框架和组件或多或少用到了闭包。
所以,了解闭包是非常必要的。呵呵...

一、什么是闭包

简而言之,就是能够读取其他函数内部变量的函数。
由于JS变量作用域的特性,外部不能访问内部变量,内部可以外部变量。

二、使用场景

1. 实现私有成员。
2. 保护命名空间,避免污染全局变量。
3. 缓存变量。

先看一个封装的例子:

var person = function () {

    // 变量作用域为函数内部,外部无法访问

    var name = "default";
    return {

        getName: function () {

            return name;

        },

        setName: function (newName) {

            name = newName;

        }

    }

}();
console.log(person.name); // 直接访问,结果为:undefined

console.log(person.getName()); // 结果为:default

console.log(person.setName("langjt"));

console.log(person.getName()); // 结果为:langjt

再看循环中常用闭包解决引用外部变量问题:

var aLi = document.getElementsByTagName('li');

for (var i=0, len=aLi.length; i<len; i++) {

   aLi[i].onclick = function() {

     alert(i); // 无论点击哪个<li>元素,弹出的值都为len,表明这里的i和在for之后打印i的值是一样的。

   };

}

使用闭包后:
var aLi = document.getElementsByTagName('li');

for (var i=0, len=aLi.length; i<len; i++) {

  aLi[i].onclick = (function(i) {

    return function() {

      alert(i); // 此时点击<li>元素,就会弹出对应的下标了。

    }

  })(i);

}

三、注意事项

1. 内存泄漏

由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题。
比如:

function foo() {

   var oDiv = document.getElementById(‘J_DIV');

   var id = oDiv.id;

   oDiv.onclick = function() {

     // alert(oDiv.id); 这里存在循环引用,IE低版本页面关闭后oDiv仍在内存中。所以尽可能缓存基本类型而不是对象。

     alert(id);

   };

   oDiv = null;

}

2. 变量命名

如果内部函数的变量和外部函数的变量名相同时,那么内部函数再也无法指向外部函数那个同名的变量。
比如:

function foo(num) {

  return function(num) {

    console.log(num); 

  }

}

var f = new foo(9);

f(); // undefined

其实上面的用法,专业术语叫函数柯里化(Currying),就是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。本质上也利用了闭包可以缓存的特性,比如:

var adder = function(num) {

    return function(y) {

        return num+y;

    };

};
var inc = adder(1);

var dec = adder(-1);

//inc, dec现在是两个新的函数,作用是将传入的参数值 (+/?)1

alert(inc(99));//100

alert(dec(101));//100 

alert(adder(100)(2));//102 

alert(adder(2)(100));//102

再比如阿里玉伯的seaJS源码中:

/**

 * util-lang.js - The minimal language enhancement

 */

function isType(type) {

  return function(obj) {

    return {}.toString.call(obj) == "[object " + type + "]"

  }

}
var isObject = isType("Object");

var isString = isType("String");

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
JS实现self的resend
Jul 22 Javascript
js data日期初始化的5种方法
Dec 29 Javascript
jQuery实现个性翻牌效果导航菜单的方法
Mar 09 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
Jun 05 Javascript
深入理解JS实现快速排序和去重
Oct 17 Javascript
微信小程序云开发详细教程
May 16 Javascript
小程序api实现promise封装过程解析
Nov 21 Javascript
详解ES6 CLASS在微信小程序中的应用实例
Apr 24 Javascript
js实现弹窗效果
Aug 09 Javascript
微信小程序实现转盘抽奖
Sep 21 Javascript
如何构建一个Vue插件并生成npm包
Oct 26 Javascript
html实现随机点名器的示例代码
Apr 02 Javascript
JavaScript学习笔记之Function对象
Jan 22 #Javascript
JavaScript学习笔记之Cookie对象
Jan 22 #Javascript
javascript二维数组转置实例
Jan 22 #Javascript
JavaScript学习笔记之内置对象
Jan 22 #Javascript
JavaScript学习笔记之JS事件对象
Jan 22 #Javascript
jquery实现搜索框常见效果的方法
Jan 22 #Javascript
JavaScript学习笔记之定时器
Jan 22 #Javascript
You might like
php进程间通讯实例分析
2016/07/11 PHP
phpcms中的评论样式修改方法
2016/10/21 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
使用jquery给input和textarea设定ie中的focus
2008/05/29 Javascript
JQuery 选择和过滤方法代码总结
2010/11/19 Javascript
javascript克隆对象深度介绍
2012/11/20 Javascript
css3元素简单的闪烁效果实现(html5 jquery)
2013/12/28 Javascript
jquery获取一个元素下面相同子元素的个数代码
2014/07/31 Javascript
整理一下常见的IE错误
2016/11/18 Javascript
鼠标经过出现气泡框的简单实例
2017/03/17 Javascript
Vuex 使用及简单实例(计数器)
2018/08/29 Javascript
vue 中基于html5 drag drap的拖放效果案例分析
2018/11/01 Javascript
Vue.js构建你的第一个包并在NPM上发布的方法步骤
2019/05/01 Javascript
layUI实现前端分页和后端分页
2019/07/27 Javascript
python操作xml文件详细介绍
2014/06/09 Python
在Linux下使用Python的matplotlib绘制数据图的教程
2015/06/11 Python
python实现上传下载文件功能
2020/11/19 Python
python实现kNN算法
2017/12/20 Python
Python3中函数参数传递方式实例详解
2019/05/05 Python
使用 pytorch 创建神经网络拟合sin函数的实现
2020/02/24 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
在django中查询获取数据,get, filter,all(),values()操作
2020/08/09 Python
详解python UDP 编程
2020/08/24 Python
深入理解css中vertical-align属性
2017/04/18 HTML / CSS
CSS实现雨滴动画效果的实例代码
2019/10/08 HTML / CSS
HTML5触摸事件演化tap事件介绍
2016/03/25 HTML / CSS
Monnier Frères美国官网:法国知名奢侈品网站
2016/11/22 全球购物
获奖的大学生创业计划书
2014/01/05 职场文书
继电保护工岗位职责
2014/01/05 职场文书
上班玩游戏检讨书
2014/02/07 职场文书
院领导写的就业推荐信
2014/03/09 职场文书
酒店开业庆典策划方案
2014/05/28 职场文书
商业计划书格式、范文
2019/03/21 职场文书
共青团优秀团员申请书(范文)
2019/08/15 职场文书
导游词之太湖
2019/10/08 职场文书
DE1107机评
2022/04/05 无线电