本文实例分析了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闭包功能与用法实例分析,包括了javascript闭包功能与用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了javascript闭包功能与用法。分享给大家供大家参考,具体如下: 理解闭包 闭包这个东西,确实是很麻烦。之前我自己的理解也是有一点误差,所以今天将文章修改修改,争取将自己的理解进一步准确化。 闭包说得通熟易懂一点,就是指有权访问另一个
本文向大家介绍JavaScript闭包与作用域链实例分析,包括了JavaScript闭包与作用域链实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript闭包与作用域链。分享给大家供大家参考,具体如下: 闭包定义 闭包指的是有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数A内部创建另一个函数B,那么函数B就是一个闭包,可以访问函数A作用域中的所
本文向大家介绍js闭包用法实例详解,包括了js闭包用法实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js闭包用法。分享给大家供大家参考,具体如下: 引言 在公司中需要写一个js脚本来进行网站的统计,实现类似百度统计或者站长统计的功能,在实现的过程中自己感觉写的代码还是可以的,因为之前的js代码都是这些写,但是在组长代码走查的时候却非常的不满意,因为我们在js中写的方法都是全局的方
本文向大家介绍javascript实现的闭包简单实例,包括了javascript实现的闭包简单实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了javascript实现的闭包。分享给大家供大家参考。具体如下: 希望本文所述对大家的javascript程序设计有所帮助。
本文向大家介绍javascript中AJAX用法实例分析,包括了javascript中AJAX用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了javascript中AJAX用法。分享给大家供大家参考。具体分析如下: 兼容地获得XMLHttpRequest对象: AJAX处理函数: 希望本文所述对大家的javascript程序设计有所帮助。
本文向大家介绍Javascript中innerHTML用法实例分析,包括了Javascript中innerHTML用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Javascript中innerHTML用法。分享给大家供大家参考。 具体实现方法如下: 希望本文所述对大家的javascript程序设计有所帮助。