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 相关文章推荐
JS Timing
Apr 21 Javascript
XMLHttpRequest处理xml格式的返回数据(示例代码)
Nov 21 Javascript
xmlhttp缓存清除的2种解决方法
Dec 13 Javascript
Js数组排序函数sort()介绍
Jun 08 Javascript
javascript图片切换综合实例(循环切换、顺序切换)
Jan 13 Javascript
Jquery轮播效果实现过程解析
Mar 30 Javascript
JS实现图片延迟加载并淡入淡出效果的简单方法
Aug 25 Javascript
详解vue-cli开发环境跨域问题解决方案
Jun 06 Javascript
Angular限制input框输入金额(是小数的话只保留两位小数点)
Jul 13 Javascript
JavaScript之实现一个简单的Vue示例
Jan 17 Javascript
vue的路由映射问题及解决方案
Oct 14 Javascript
js实现金山打字通小游戏
Jul 24 Javascript
浅谈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
PHP读取目录下所有文件的代码
2008/01/07 PHP
php fckeditor 调用的函数
2009/06/21 PHP
php使HTML标签自动补全闭合函数代码
2012/10/04 PHP
简单的php中文转拼音的实现代码
2014/02/11 PHP
PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
2015/12/24 PHP
解读PHP的Yii框架中请求与响应的处理流程
2016/03/17 PHP
Javascript实现动态菜单添加的实例代码
2013/07/05 Javascript
jquery ajax 调用失败的原因示例介绍
2013/09/27 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(jquery)
2014/11/16 Javascript
原生js与jQuery实现简单的tab切换特效对比
2015/07/30 Javascript
ionic组件ion-tabs选项卡切换效果实例
2016/08/27 Javascript
Angular2 (RC5) 路由与导航详解
2016/09/21 Javascript
EasyUI学习之Combobox级联下拉列表(2)
2016/12/29 Javascript
ES6(ECMAScript 6)新特性之模板字符串用法分析
2017/04/01 Javascript
基于JavaScript实现的快速排序算法分析
2017/04/14 Javascript
使用Node.js在深度学习中做图片预处理的方法
2019/09/18 Javascript
[51:53]完美世界DOTA2联赛决赛日 Inki vs LBZS 第二场 11.08
2020/11/10 DOTA
天翼开放平台免费短信验证码接口使用实例
2013/12/18 Python
使用Python编写Linux系统守护进程实例
2015/02/03 Python
python Pandas 读取txt表格的实例
2018/04/29 Python
pytorch 数据集图片显示方法
2018/07/26 Python
Python面向对象基础入门之编码细节与注意事项
2018/12/11 Python
Python实现的统计文章单词次数功能示例
2019/07/08 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
2019/07/28 Python
Django 查询数据库并返回页面的例子
2019/08/12 Python
python将数组n等分的实例
2019/12/02 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
python代码如何注释
2020/06/01 Python
英国豪华装饰照明品牌的在线零售商:Inspyer Lighting
2019/12/10 全球购物
中专生自我鉴定范文
2014/02/02 职场文书
乡镇党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
2014乡党委副书记党建工作汇报材料
2014/11/02 职场文书
酒店客房服务员岗位职责
2015/04/09 职场文书
朋友聚会开场白
2015/06/01 职场文书
MySQL 视图(View)原理解析
2021/05/19 MySQL
Python还能这么玩之用Python做个小游戏的外挂
2021/06/04 Python