闭包原理java_[Java教程]闭包工作原理

[Java教程]闭包工作原理

0 2015-10-04 20:00:03

闭包(Closure)是JavaScript语言中一个非常重要的特性

在Javascript语言中,只有函数中的子函数才能引用函数中的变量,简单来说,闭包就是定义在函数中的函数,是函数内外部连接的桥梁

闭包的意义是:当前作用域总是能够访问外部作用域中的变量;函数是唯一拥有自身作用域的结构,所以闭包的创建依赖于函数

变量的作用域

闭包是Javascript语言中的一个难点,理解闭包之前,先来理解一下变量的作用域

全局变量、局部变量是变量的作用域仅有的两种形态;一般来说,全局变量可以在任意作用域中引用,而局部变量则只能在当前作用域中引用。先看如下代码所示var number = 1;var Get_Number = function (){console.log(number);};Get_Number();

输出结果为1;这是一个全局变量,可以在任意作用域中引用。再看如下代码所示var Get_Number = function (){var number = 1;};console.log(number);

输出结果为ReferenceError: number is not defined;这是一个局部变量,无法在外部作用域中引用该变量,运行该函数后也不能。接着看如下代码所示var Get_Number = function (){var number = 1;};Get_Number();console.log(number);

输出结果同上;需要注意的是,局部变量的声明必须使用var命令,否则运行该函数后相当于声明了一个全局变量。代码如下所示var Get_Number = function (){number = 1;};Get_Number();console.log(number);

输出结果为1;这里实际上是声明了一个全局变量

引用局部变量

正常来说,局部变量只能在函数中引用。先看如下代码所示var Get_Number = function (){var number = 1;var Out_Number = function (){console.log(number ++);};Out_Number();};Get_Number();

输出结果为1;子函数可以引用当前作用域中的变量,这实际上是JavaScript语言中的一个特色结构——作用域链(Scope Chain)。既然子函数可以引用该变量,那么我们return子函数,是不是就可以在外部作用域中引用该变量了。代码如下所示var Get_Number = function (){var number = 1;var Out_Number = function (){console.log(number ++);};return Out_Number;};var r = Get_Number();r();

输出结果为1;并且我们继续执行r(),输出值会递增——2、3、4、5,这个值被存储于内存中,这个Out_Number子函数正是我们要讨论的闭包

闭包的使用

闭包的两大作用,一个是读取函数中的变量,另外一个是将函数中的变量的值存储于内存中。先看如下代码所示var Get_Number = function (){var number = 1;return {plus: function (){number ++;},out: function (){return number;}};};var r = Get_Number();r.plus();r.out();

返回值为2;2个闭包plus、out都维持着对Get_Number外部作用域的引用,在当前作用域中,只能通过这2个闭包访问Get_Number外部作用域。代码如下所示var Get_Number = function (){var number = 1;return {plus: function (){number ++;},out: function (){return number;}};};var r = Get_Number();r.change = function (){number = 0;};

r.change();r.plus();r.out();

返回值同上;r.change并没有改变Get_Number外部作用域中的变量number的值,它作用仅仅是声明或覆盖了全局变量number

闭包可以在函数外部改变函数中的变量的值,如果你把函数作为对象、闭包作为方法、局部变量作为私有属性使用,则会改变该变量的值;闭包还会把函数中的变量的值存储于内存中,对内存消耗很大,所以滥用闭包的结果就是影响网页性能,IE中则可能导致内存泄露

本文网址:http://www.shaoqun.com/a/146440.html

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:admin@shaoqun.com。

0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值