4、JavaScript高级之闭包
来源:互联网 发布:不定积分 软件 编辑:程序博客网 时间:2024/06/11 18:35
一、什么是闭包
距离上一次更新有一段时间了,过年你懂得,接下来就谈谈JavaScript的高级用法——闭包。js的闭包其实不是什么难懂的高深的概念,只是有些书籍当中介绍的不够易懂或者说举得例子不太恰当,现在我们就通过简单的例子来理解“闭包”。作为程序员,也许一段针对的代码,比那些文字描述更能说明问题,用代码说话,眼见为实。
好了,先看下面的一段代码:
function t1(){ var age = 20; function t2(){ alert(age); } return t2; } var age = 100; var temp = t1(); temp();//20
为了突出 执行效果,在t1函数外层也定义了一个age=100的变量,执行完 var temp = t1(); 后,将函数t2赋予了temp,这样temp其实就是t2函数的引用,紧接着执行temp,输出结果竟然是20,毫无疑问,变量age是在t1函数的作用域下的,你已经看到JavaScript语言与其他语言不同的地方。
在大部分语言中,如java,函数t1内的局部变量会随着函数t1执行结束而销毁,但是在js中,变量age=20却被t2捕抓,即使是t1函数执行结束后,依然可以通过t2访问到age
这种情况,即返回的t2函数不是孤立的,甚至把周围的变量环境,形成了一个‘封闭包’,一起返回,所以叫‘闭包’
二、闭包的应用
JavaScript既然有闭包的实现,那么JavaScript的闭包是怎么使用的或应用在哪种情况下呢?通过上面的例子已经看到,函数t1内部的age变量只能通过返回的t2函数访问,那么age是不是相当于java的private私有变量呢,哈哈,这个在下一篇会讲到,而且将通过“闭包”将属性封装在内部,做成接口,别人也就看不见,也不会污染到其他的变量,想想是不是呢。
讲那么多,我们就通过一个实际的例子看看:
要求:实现一个计数器,每次调用某函数,使计时器的值加1
1、闭包实现
function counter(){ var i = 0;//但counter执行完毕后,除了返回的inc函数,其他函数访问不了变量i var inc = function(){ return ++i; } return inc; } var c = counter(); alert(c()); alert(c()); alert(c());2、可以结合“匿名”函数,进行简化
var counter = (function(){ var i = 0; return function(){ return ++i; } })(); alert(counter()); alert(counter()); alert(counter());相信你已经看到了闭包的好处,但是请不到胡乱使用闭包,因为在IE浏览器下是使用“计数”的方式跟踪对象来进行垃圾回收的,由于闭包的特新,不会释放局部变量,如果造成过多的循环引用,将会引起“内存泄露”。
0 0
- 4、JavaScript高级之闭包
- JavaScript高级之闭包
- javascript 高级系列之闭包(closure)
- JavaScript高级之闭包的概念及其应用
- JavaScript高级之闭包的概念及其应用
- JavaScript高级之-------闭包的概念及其应用
- JavaScript高级程序设计闭包
- 闭包 ---- 《JavaScript高级程序设计》中的解释
- javascript闭包的高级用法
- JavaScript高级程序设计闭包学习理解
- JavaScript 4.3 函数高级-闭包
- 闭包《javascript高级程序设计》笔记
- JavaScript高级程序设计之函数表达式之闭包之闭包与变量第7.2.1讲笔记
- javascript 之 闭包
- JavaScript之闭包
- JavaScript 之 闭包
- JavaScript之闭包
- javascript之闭包
- Python特殊语法:filter、map、reduce、lambda [转]
- Unbuntu下搭建嵌入式QT开发环境(Tiny210)
- Windows 2008允许多用户远程登录设置
- wget for windows
- cocos2d-x中的事件分发机制
- 4、JavaScript高级之闭包
- Hadoop 解除 “Name node is in safe mode”
- MongoDB设置访问权限、设置用户
- 高仿qq5.0侧滑效果
- 使用SharedPreferences
- Linux程序设计(Linux shell编程四)
- Rotate Array
- ios touch事件 点击事件
- Codeforces Round #294 (Div. 2) (C D E)