闭包的概念

内层的函数可以引用存在于包围它的函数内的变量,即使外层函数的执行已经终止。可理解为,闭包就是能够读取其他函数内部变量的函数。

表现形式是:定义在函数内部的函数。

  1.   function f1(){
  2.     var n=999;
  3.     function f2(){
  4.       alert(n); //
  5.     }
  6.   }

如上,f2函数可以访问到f1的局部变量n

反之则不行。我们无法获得内置函数的局部变量。

  1. function add(num1){
  2. return function(num2){
  3. return num1+num2;
  4. };
  5. }
  6. var num2 = add(4);
    // 9
  7. alert(num2(5));

闭包的作用

1. 使用匿名函数来隐藏全局作用域变量

这是一个自执行函数,对于msg变量,执行完立即释放。不污染全局对象。

  1. (function(){
  2. var msg = "Bye";
  3. window.onload=function(){
  4. alert(msg);
  5. }
  6.  
  7. })();

闭包的问题:闭包可以引用父函数中的变量,但提供的值并非该变量创建时的值,是在父函数范围内的最终值。最常见的问题是在for循环中

2. 绑定事件的例子

  1.通过数组给对象绑定多个事件
  2.obj.方法名 等价于 obj"方法名"]数组写法

  1. (function(){
  2. var obj = document.getElementById("main");
  3. var items = ["click","mouseover"];
  4. for(var i=0;i<items.length;i++){
  5. (function(){
  6. var item = items[i];
  7. obj["on"+ item] = function(){
  8. alert("you have "+item);
  9. }
  10. })()
  11. }
  12. })();

3. 结果缓存

有一个需求,每次执行变量值加1。在不使用全局变量的情况下我们可以使用闭包

  1. function f1(){
  2. var n = 1;
  3. plusOne = function(){
  4. n+=1;
  5. alert(n);
  6. }
  7. return plusOne;
  8. }
  9.  
  10. f1();
  11. plusOne(); // 2
  12. plusOne(); // 3
  13. // n is not defined
  14. alert(n);

4. 封装, 模拟对象的私有方法

  1. var person = function(){
  2. //变量作用域为函数内部,外部无法访问
  3. var name = "default";
  4.  
  5. return {
  6. getName : function(){
  7. return name;
  8. },
  9. setName : function(newName){
  10. name = newName;
  11. }
  12. }
  13. }();
  14.  
  15. print(person.name);//直接访问,结果为undefined
  16. print(person.getName());
  17. person.setName("abruzzi");
  18. print(person.getName());

再来个例子

  1. var event = {};
  2.  
  3. (function(){
  4. var add = function(){
  5. return this.age+1;
  6. }
  7. event.add = add;
  8. })();

  9. event.age = 1;
  10. var age = event.add();
  11. alert(age)
    // 出错
    add()

上例中。add是局部方法,却可以通过全局对象event调用。防止暴露了内部方法。这样可以提高安全性。

参考:

http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

http://www.2cto.com/kf/201410/342609.html

Javascript闭包例子的更多相关文章

  1. javascript 闭包(转)

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...

  2. JavaScript 闭包整合

    初遇闭包感觉很困惑,上网查看了些许介绍,有很多没看懂,就想先对能懂的东西整整 首先觉得要了解闭包,要先对一.JavaScript的变量作用域和作用域链有基本了解 1.变量的作用域分为:全局变量和局部变 ...

  3. 对于 Javascript 闭包理解

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...

  4. javascript闭包的理解

    闭包是Javascript的一个难点,但也是一个很重要的知识点. 1.首先我们要知道变量作用域链 变量的作用域分两种:全局变量和局部变量.没有定义到任何函数中的变量为全局变量,在函数中定义的变量为局部 ...

  5. 深入理解javascript闭包(一)

    原文转自脚本之家(http://www.jb51.net/article/24101.htm) 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. ...

  6. JavaScript“闭包”精解

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. 详细了解 Javascript语言的特殊之处,就在于函数内部可以直接读 ...

  7. javascript闭包和this对象

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域 ...

  8. javascript 闭包学习

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域 ...

  9. 《Web 前端面试指南》1、JavaScript 闭包深入浅出

    闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...

随机推荐

  1. Cloud Tool 小探索

    Google Apps不用多说. Google drive免费提供15GB的容量. Microsoft Windows Live感觉功能上和google相比无亮点和优势. SkyDrive免费提供7G ...

  2. php-------面向对象详解

    php面向对象详解 面向对象 对象概念是面向对象技术的核心.在显示世界里我们所面对的事情都是对象,如计算机.电视机.自行车等.在面向对象的程序设计中,对象是一个由信息及对信息进行处理的描述所组成的整体 ...

  3. PHP基础系列(二) PHP数组相关的函数分类整理

    之前写过一篇介绍 PHP字符串函数 的博文,这里写第二篇,本文主要介绍PHP 数组相关的函数: 一.检查数组中是否存在 array_key_exists — 检查给定的键名或索引是否存在于数组中 ar ...

  4. [19/04/12-星期五] 多线程_任务定时调度(Timer、Timetask和QUARTZ)

    一.Timer和Timetask 通过Timer和Timetask,我们可以实现定时启动某个线程. java.util.Timer 在这种实现方式中,Timer类作用是类似闹钟的功能,也就是定时或者每 ...

  5. Linear Search

    Search I You are given a sequence of n integers S and a sequence of different q integers T. Write a ...

  6. FastJSON使用列子

    一.介绍: 前一段时间使用FastJSON对前台传入的数据进行处理,数据格式为JSONObject存入到数据库的一个字段里,前台以JSONArray传给后台,在JSONArray里存放不同的对象,当部 ...

  7. webstorm window找不到文件'chrome'

    1.打开webstorm设置: File->Settings->Tools->Web Browsers->更改谷歌浏览器的Path(获取方式:谷歌浏览器的快捷键->右键- ...

  8. 双T滤波电路用于PWM方式DAC的分析

    双T滤波电路用于PWM方式DAC的分析   之前做温度控制的时候,用到了PWM到DAC的转化,PWM方波,经过滤波,怎么就变成了直流的信号,之前我也很困惑这一点.用频域的方法可以近似说明,但是严格的数 ...

  9. flask模板语言,装饰器,路由及配置

    1.模板语言jinja2 Flask中默认的模板语言是Jinja2 1.0 模板传参 from flask import Flask,render_template app = Flask(__nam ...

  10. Spring知识点小结(四)

    一.JdbcTemplate(jdbc模版--抽取的工具) web阶段DBUtils:        QueryRunner runner = new QueryRunner(dataSource); ...