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展开闭合效果演示代码
Jul 24 Javascript
地址栏传递中文参数乱码在js里用escape转码
Aug 28 Javascript
jquery判断RadioButtonList和RadioButton中是否有选中项示例
Sep 29 Javascript
js获取select标签的值且兼容IE与firefox
Dec 30 Javascript
基于Jquery和CSS3制作数字时钟附源码下载(CSS3篇)
Nov 24 Javascript
jQuery实现查找最近父节点的方法
Jun 23 Javascript
微信小程序实现联动选择器
Feb 15 Javascript
详解在微信小程序的JS脚本中使用Promise来优化函数处理
Mar 06 Javascript
在JavaScript中如何访问暂未存在的嵌套对象
Jun 18 Javascript
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
Sep 01 Javascript
解决Mint-ui 框架Popup和Datetime Picker组件滚动穿透的问题
Nov 04 Javascript
Nest.js散列与加密实例详解
Feb 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 5.5 新特性
2013/07/02 PHP
完美解决Thinkphp3.2中插入相同数据的问题
2017/08/01 PHP
php读取本地json文件的实例
2018/03/07 PHP
详解php curl带有csrf-token验证模拟提交方法
2018/04/18 PHP
javascript数组的扩展实现代码集合
2008/06/01 Javascript
JQuery下的Live方法和$.browser方法使用代码
2010/06/02 Javascript
javascript 闭包
2011/09/15 Javascript
首页图片漂浮效果示例代码
2014/06/05 Javascript
js控制鼠标事件移动及移出效果显示
2014/10/19 Javascript
jquery实现的V字形显示效果代码
2015/10/27 Javascript
ES6中的数组扩展方法
2016/08/26 Javascript
简单的vue-resourse获取json并应用到模板示例
2017/02/10 Javascript
详解AngularJs路由之Ui-router-resolve(预加载)
2017/06/13 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
vue实现element-ui对话框可拖拽功能
2018/08/17 Javascript
Js通过AES加密后PHP用Openssl解密的方法
2019/07/12 Javascript
实例讲解React 组件生命周期
2020/07/08 Javascript
JavaScript中while循环的基础使用教程
2020/08/11 Javascript
[06:07]辉夜杯现场观众互动 “比谁远送显示器”
2015/12/26 DOTA
Python3连接MySQL(pymysql)模拟转账实现代码
2016/05/24 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
2017/11/23 Python
python使用os.listdir和os.walk获得文件的路径的方法
2017/12/16 Python
Django项目实战之用户头像上传与访问的示例
2018/04/21 Python
python中的不可变数据类型与可变数据类型详解
2018/09/16 Python
对Python中Iterator和Iterable的区别详解
2018/10/18 Python
对numpy中向量式三目运算符详解
2018/10/31 Python
对python多线程与global变量详解
2018/11/09 Python
python——全排列数的生成方式
2020/02/26 Python
如何写python的配置文件
2020/06/07 Python
全球速卖通巴西站点:Aliexpress巴西
2016/08/24 全球购物
SmartBuyGlasses德国:购买太阳镜和眼镜
2019/08/20 全球购物
领导干部廉政承诺书
2014/03/27 职场文书
二年级班级文化建设方案
2014/05/10 职场文书
2015年秋季小班开学寄语
2015/05/27 职场文书
python flask框架快速入门
2021/05/14 Python
Java基于Dijkstra算法实现校园导游程序
2022/03/17 Java/Android