zoukankan      html  css  js  c++  java
  • 小识闭包【2013/07/18】

    想写关于闭包的博文很久很久很久了,久到我忘了写,现在补回来……

    闭包,closure, 一个挺形象的词, 初学的时候,感觉就像大门就在前面,但是要向左转再向右转再左转再右转再转转转才能进去一样——好啦,铺垫完了,别被吓到,其实闭包还是挺容易懂的。

    首先,先简单明确一下变量的作用域。

    javascript 变量无非就两种: 全局变量和局部变量。

    同其他语言类似,全局变量的作用域是整个文件,局部变量只作用于声明它的函数内。

    js 是弱语言类型,声明全局变量的时候不需要声明为var 变量 ,而局部变量则必须用var 声明。

    Action...

    什么是闭包?

    我自己的简单理解,闭包就是一个函数里面包着另外一个函数(子函数),然后返回这个函数,这样,这个子函数就能读取局部变量了。所以,我们可以认为闭包就是函数的局部变量集合,只是这些局部变量在函数返回后会继续存在,从存储上说,闭包就是函数的堆栈在函数返回后并不释放,我们可以认为这些函数是在堆上分配的。简言之,当一个函数内定义了另外一个函数,就会产生闭包。

    下面用一个通俗易懂的例子来帮助大家认识闭包:

    你已经看到个神奇的东西了,函数b嵌套在函数a内部,函数a的返回值是b

    执行完 var c = a();之后,变量实际上指向了函数b,再执行下去,就会打印出result1

    。这样就创建了一个闭包,因为函数a外的变量c引用了函数a内部的函数b。还是不懂???继续看……

    为什么要用闭包?

    闭包使得js的垃圾回收机制不会收回a所占用的资源,因为b的执行需要依赖a中的变量i,所以,始终存在,这有点类似于 C语言中的静态变量,每次执行完c(); i都自加了1.

    1) 闭包保护了函数内的变量安全。回到刚刚那个例子,函数a中的i只有函数b才能访问,其他途径无法访问,因此保护了的安全性

    2) 因为每次执行c(); , 都自加了1,说明这是在内存中维持了这个变量。

    闭包使用存在的问题

    1)上面讲到闭包使得变量一直保存在内存中,这样的话,内存消耗就大了,所以,不能滥用闭包,否则讲导致网页的性能问题,在IE中也有可能会导致内存泄露。解决的方法:在退出函数之前,将不再使用的局部变量删除。

    2)闭包函数会改变外层函数内部变量的值。

    关于闭包,是js一个难点也是重点,需要不断深入学习!

  • 相关阅读:
    Silverlight 数据绑定 (1):怎样实现数据绑定
    DynamicPopulateExtender 控件调 WebService 的500错误
    [翻译]Linq 的 7 个技巧简化程序操作
    [Silverlight] 一个易犯的错误:关于调用 WCF 服务
    Silverlight 数据绑定 (2):Source to Target
    KB kb KB大小写
    C# winform 程序中响应键盘事件
    异常“企图释放并非呼叫方所拥有的多用户终端运行程序”的处理
    php完美截取中文字符函数mb_substr
    php面试题(三)
  • 原文地址:https://www.cnblogs.com/zhengyingyan/p/3627227.html
Copyright © 2011-2022 走看看