1. 要理解闭包,首先要理解变量作用域,变量的作用域就两种,全局变量和局部变量,函数内部可以直接读取全局变量,函数外部无法读取函数内部的局部变量。
    闭包定义:能读取函数内部局部变量的函数就是闭包,而只有函数内部的子函数才能读取局部变量,所以本质上,闭包就是将函数内部和函数外部链接起来的一栋桥梁。
    闭包作用:一个是可以读取函数内部的局部变量,一个是让这些变量的值始终保存在内存中。
    注意事项: 1)由于闭包会使函数中的变量保存在内存中,内存消耗很大,所以不能滥用。解决办法是在退出函数之前,将不使用的局部变量全部删除。
          2)闭包会在父函数的外部,改变父函数变量的值。所以,如果你把父函数当对象使用,把闭包当做它的公用方法,把内部变量当做它的私有属性。这时不能随便修改父函数内部变量的值。
  2.  
  3. 1 <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <title></title>
  7. <script type="text/javascript">
  8. /*闭包*/
  9.  
  10. //返回了一个包含两个方法的对象,并且这两个方法继续享有访问value的权限
  11. var myObject=function () {
  12. var value=0;
  13. return{
  14. increment:function(inc){
  15. value+=typeof inc==='number'?inc :1;
  16. },
  17. getValue:function(){
  18. return value;
  19. }
  20. };
  21. }();
  22.  
  23. //函数无需用new来使用,返回一个包含get_status方法的新对象。此函数可以访问它被创建时的上下文环境。这成为闭包。
  24. var quo=function(status){
  25. return {
  26. get_status:function(){
  27. return status;
  28. }
  29. }
  30. };
  31. var myquo=quo("amazed");
  32. document.writeln(myquo.get_status());
  33.  
  34. //定义一个函数,它设置一个DOM节点为黄色,然后把它渐变为白色
  35. var fade=function(node){
  36. var level=1;
  37. var step=function(){
  38. var hex=level.toString(16);
  39. node.style.backgroundColor='#FFFF'+hex+hex;
  40. if(level<15){
  41. level+=1;
  42. setTimeout(step,100);
  43. }
  44. };
  45. setTimeout(step,100);
  46. };
  47. fade(document.body);
  48. /*****************实例******************************************/
  49. var add_the_handlers=function(nodes){
  50. var i;
  51. for(i=0;i<nodes.length;i+=1){
  52. nodes[i].onclick=function(e){
  53. alert(i);
  54. };
  55. }
  56. };
  57. var add_the_handlers1=function(nodes){
  58. var i;
  59. for(i=0;i<nodes.length;i+=1){
  60. nodes[i].onclick=function(i){
  61. return function(e){
  62. alert(e);
  63. };
  64. }(i);
  65. }
  66. };
  67. var nodes1=document.getElementsByTagName("button");
  68. add_the_handlers1(nodes1);
  69. </script>
  70. </head>
  71. <body>
  72. <button>1</button>
  73. <button>2</button>
  74. <button>3</button>
  75. <button>4</button>
  76. <button>5</button>
  77. </body>
  78. </html>

什么是闭包:当函数在定义它的作用域的外部被引用时,就创建了该内部函数的闭包,如果内部函数引用了位于外部函数的变量,当外部函数调用完毕后,这些变量在内存不会被释放,因为闭包需要它们。

《JS语言精粹》学习笔记 函数部分の闭包的更多相关文章

  1. swift swift学习笔记--函数和闭包

    使用 func来声明一个函数.通过在名字之后在圆括号内添加一系列参数来调用这个方法.使用 ->来分隔形式参数名字类型和函数返回的类型 func greet(person: String, day ...

  2. Swift学习笔记 - 函数与闭包

    import Foundation //1.函数的定义与调用//以 func 作为前缀,返回箭头 -> 表示函数的返回类型func sayHello(name: String) -> St ...

  3. Scala学习笔记——函数和闭包

    1.本地函数 可以在一个方法内再次定义一个方法,这个方法就是外部方法的内部私有方法,省略了private关键字 2.头等函数 var increase = (x: Int) => x + 1 S ...

  4. js语言精粹读书笔记一

    一.语法 1.

  5. JavaScript语言精粹学习笔记

    0.JavaScript的简单数据类型包括数字.字符创.布尔值(true/false).null和undefined值,其它值都是对象. 1.JavaScript只有一个数字类型,它在内部被表示为64 ...

  6. Underscore.js 源码学习笔记(下)

    上接 Underscore.js 源码学习笔记(上) === 756 行开始 函数部分. var executeBound = function(sourceFunc, boundFunc, cont ...

  7. 【09-23】js原型继承学习笔记

    js原型继承学习笔记 function funcA(){ this.a="prototype a"; } var b=new funcA(); b.a="object a ...

  8. Underscore.js 源码学习笔记(上)

    版本 Underscore.js 1.9.1 一共 1693 行.注释我就删了,太长了… 整体是一个 (function() {...}());  这样的东西,我们应该知道这是一个 IIFE(立即执行 ...

  9. # C语言假期学习笔记——6

    C语言假期学习笔记--6 数组 主要学习了一位数组和二维数组. 数组是一组具有相同类型的变量的集合.C语言程序通过元素的下标来访问数组中的元素.(下标从0开始) 一位数组 类型 数组名[元素个数] 二 ...

随机推荐

  1. GDB调试汇编堆栈

    GDB调试汇编堆栈 分析过程 C语言源代码 int g(int x) { return x+6; } int f(int x) { return g(x+1); } int main(void) { ...

  2. [翻译svg教程]Path元素 svg中最神奇的元素!

    先看一个实例 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999 ...

  3. 【BZOJ3314】 [Usaco2013 Nov]Crowded Cows 单调队列

    第一次写单调队列太垃圾... 左右各扫一遍即可. #include <iostream> #include <cstdio> #include <cstring> ...

  4. 初步了解CPU

    了解CPU By JackKing_defier 首先说明一下,本文内容主要是简单说明CPU的大致原理,所需要的前提知识我会提出,但是由于篇幅我不会再详细讲解需要的其他基础知识.默认学过工科基础课. ...

  5. Avoiding InvokeRequired

    Just read a good article to do cross-thread calling in an easy and elegant way. It is amazing for it ...

  6. C#调用exe文件,IIS发布后无法掉用本地exe程序的解决方法

    http://blog.csdn.net/junjieking/article/details/6277836?reload这位楼主的问题,我也遇到了,但是我按照他那样操作并没有解决问题,弄了好久终于 ...

  7. Github+Jekyll —— 创建个人免费博客(一)从零开始

    摘要: 本文中我将介绍一下如何在github上搭建个人Blog(博客),也顺便让我们掌握一下github Pages功能,另外还涉及到Jekyll技术. ======================= ...

  8. 站内全文检索服务来了,Xungle提供免费全文检索服务

    免费站内全文检索服务来了,是的,你没听错.全文检索相信大家已经不太陌生,主流检索服务有sphinx.xunsearch等,但这些都受服务器限制,对于中小站长尤其是没有服务器实现就困难了,随着数据量的增 ...

  9. Jquery学习插件之手风琴

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. 关于PHP中<?php ?>的结束标签是否添加

    在纯PHP代码中“?>”结束标签最好不要添加 原因:容易导致输出多余的空白或者换行,以及由此产生的一些报错. 比如a.php文件中,在?>标签后面多出空格或者换行,而当b.php文件引入a ...