js闭包实例汇总


Posted in Javascript onNovember 09, 2014

Js闭包
闭包前要了解的知识
1. 函数作用域
(1).Js语言特殊之处在于函数内部可以直接读取全局变量

<script type="text/javascript">

var n=100;

function parent(){

  alert(n);

}

parent();//100

</script>

如果在php里

<?php

$n=100;

function parent(){

  echo $n;

}

parent();//会报错 n未定义

?>

(2).在函数外部无法读取函数内的局部变量

<script type="text/javascript">

function parent(){

  var m=50;

}

parent();

alert(m);//报错 m未定义

</script>

注意函数内部声明变量时一定要加var,否则就声明了一个全局变量

function parent(){

m=50;

}

parent();

alert(m);//50

//当然在php里更是如此了,

<?php

function parent(){

  global $m;//全局 ,定义与赋值要分开

  $m=50;

}

parent();

echo $m;//50

?>

//没global的话,一样会报没定义的错误

有时,需要得到函数内部的的局部变量,就需要变通的方法实现利用js变量作用域的特点,如在函数内部定义子函数,对于子函数来说,父函数就是它的全局,子函数可以访问父函数里的变量(对于整个js代码来说又是局部变量)

<script type="text/javascript">

function parent(){

   var m=50;

   function son(){

        alert(m);

   }

   return son;

}

var s=parent();//将结果保存在全局里

s();//50

</script>

Parent内部所有局部变量对其子函数来说都是可见的,但其子函数内的局部变量对其父函数是不可见的,这就是js特有的链式作用域结构,子对象会一级一级地向上查找所有父对象的变量,父对象的所有变量对子对象都是可见的,反之不成立!上面的son函数就是闭包
有些同学可能这样

function parent(){

   var m=50;

   function son(){

        alert(m);

   }

}

parent();

son()//会报 函数son未定义

注意 在javascript里,在函数里声明的函数都是局部的,函数运行完后就释放了
注意这点与php的区别

<?php

function parent(){

  function son(){

      $m=50;

      echo $m;

  }

}

parent();

son();//输出50 不会报错

?>

闭包

函数内部定义函数,连接函数内部和外部的桥梁
闭包的作用有2个:
一是前面提到的读取函数内部的变量,
二是让这些变量的值保存在内存中,实现数据共享
下面是几个闭包的例子

<script type="text/javascript">

var cnt=(function(){

    var i=0;

    return function(){

        alert(i);

        i++;

    }

})();

cnt();//0

cnt();//1

cnt();//2

cnt();//3
</script>

把匿名函数的执行结果(即对里面子函数的声明赋给全局变量cut),i就保存在内存里了
执行cut()时就直接从内存取值了,i只有cnt()函数才能调用,直接alert(i)是不行的
还可以向闭包内传参

var cnt=(function(num){

return function(){

    alert(num);

    num++;

  }

})(5);

cnt();//5

cnt();//6

cnt();//7

//当然还可以调用时传参

var cnt=(function(){

    var i=0;

return function(num){

    num+=i;

    alert(num);

    i++;

  }

})();

cnt(1);//1

cnt(2);//3

cnt(3);//5

为了对闭包有更好的理解,我们看以下代码
比如我想返回一个数组,数组里面有5个函数,第一个函数弹出0,第二个弹出1... 
代码如果这样写

function box(){

  var arr=[];

  for(i=0;i<5;i++){

      arr=function(){return i;}

    }

return arr;   

}

var a=box();

alert(a);//包含五个函数体的数组

alert(a[0]());

alert(a[1]());

弹出的函数体
function(){return i;}    }
最后这个i是4,之后++成为5
For循环停止
发现均弹出5,明显不符合我们的要求

解决方案1
自我即时执行里面的函数

function box(){

  var arr=[];

  for(i=0;i<5;i++){

      arr=(function(num){return i;})(i);

    }

return arr;   

}

var a=box();

for(var i=0;i<a.length;i++){

  alert(a);

}

但是我们发现 返回的数组里的元素是函数执行的结果,但我们想要的是函数有得升级我们的代码

解决方案2
闭包实现

function box(){

var arr=[];

        for(var i=0;i<5;i++){
                 arr=(function(num){

                     return function(){return num;}

                 })(i);
         }

return arr;         

}
var arr=box();
for(var i=0;i<5;i++){
    alert(arr());//0,1,2,3,4

}

关键代码

arr=(function(num){ 

         return function(){return num;}

})(i);


i=0 时 

arr[0]=(function(num){return function(){return num;}})(0);
1时


arr[1]=(function(num){return function(){return num;}})(1); 

  以上就是闭包的好处!非常简单实用吧。

Javascript 相关文章推荐
jQuery Pagination Ajax分页插件(分页切换时无刷新与延迟)中文翻译版
Jan 11 Javascript
THREE.JS入门教程(4)创建粒子系统
Jan 24 Javascript
jquery清空textarea等输入框实现代码
Apr 22 Javascript
Javascript实现禁止输入中文或英文的例子
Dec 09 Javascript
JavaScript 事件对象介绍
Apr 13 Javascript
JavaScript之AOP编程实例
Jul 17 Javascript
jqTransform美化表单
Oct 10 Javascript
JQuery ztree 异步加载实例讲解
Feb 25 Javascript
layui中的switch开关实现方法
Sep 03 Javascript
详解如何在JS代码中消灭for循环
Dec 11 Javascript
jQuery 添加元素和删除元素的方法
Jul 15 jQuery
vue数据字典取键值项目的字典问题
Apr 12 Vue.js
浅谈JS闭包中的循环绑定处理程序
Nov 09 #Javascript
jQuery函数map()和each()介绍及异同点分析
Nov 08 #Javascript
js跨域问题浅析及解决方法优缺点对比
Nov 08 #Javascript
js 操作符汇总
Nov 08 #Javascript
jquery的总体架构分析及实现示例详解
Nov 08 #Javascript
jquery常用方法及使用示例汇总
Nov 08 #Javascript
JQuery遍历json数组的3种方法
Nov 08 #Javascript
You might like
提问的智慧(2)
2006/10/09 PHP
一个简单的PHP入门源程序
2006/10/09 PHP
CodeIgniter实现更改view文件夹路径的方法
2014/07/04 PHP
PHP实现提高SESSION响应速度的几种方法详解
2019/08/09 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
2019/10/15 PHP
jQuery $.each的用法说明
2010/03/22 Javascript
浅析JavaScript中的类型和对象
2013/11/29 Javascript
判断iframe里的页面是否加载完成
2014/06/06 Javascript
JQuery遍历json数组的3种方法
2014/11/08 Javascript
学习JavaScript设计模式(继承)
2015/11/26 Javascript
再谈JavaScript异步编程
2016/01/27 Javascript
mvc 、bootstrap 结合分布式图简单实现分页
2016/10/10 Javascript
JS跨域请求外部服务器的资源
2017/02/06 Javascript
jquery仿苹果的时间/日期选择效果
2017/03/08 Javascript
React-Native中props具体使用详解
2017/09/04 Javascript
Gulp实现静态网页模块化的方法详解
2018/01/09 Javascript
js实现简单的打印表格
2020/01/15 Javascript
ES6函数和数组用法实例分析
2020/05/23 Javascript
Vue使用v-viewer实现图片预览
2020/10/21 Javascript
[31:01]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS Orenda
2014/05/23 DOTA
[57:53]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#3OG VS VP
2016/03/03 DOTA
[01:22]DOTA2神秘商店携大量周边降临完美大师赛
2017/11/07 DOTA
[40:05]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python多进程实现进程间通信实例
2017/11/24 Python
Python反转序列的方法实例分析
2018/03/21 Python
Python3 A*寻路算法实现方式
2019/12/24 Python
pytorch GAN伪造手写体mnist数据集方式
2020/01/10 Python
Daniel Wellington官方海外旗舰店:丹尼尔惠灵顿DW手表
2018/02/22 全球购物
工程部主管岗位职责
2013/11/17 职场文书
你懂得怎么写自荐信吗?
2013/12/27 职场文书
大学生的网上创业计划书
2013/12/31 职场文书
三年级科学教学反思
2014/01/29 职场文书
市场营销专业自荐书
2014/06/10 职场文书
教师学习八项规定六项禁令思想汇报
2014/09/27 职场文书
使用Ajax实现进度条的绘制
2022/04/07 Javascript
插件导致ECharts被全量引入的坑示例解析
2022/09/23 Javascript