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 相关文章推荐
Extjs学习笔记之一 初识Extjs之MessageBox
Jan 07 Javascript
ASP.NET jQuery 实例5 (显示CheckBoxList成员选中的内容)
Jan 13 Javascript
js实现动态添加、删除行、onkeyup表格求和示例
Aug 18 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
Aug 22 Javascript
用js判断是否为360浏览器的实现代码
Jan 15 Javascript
微信小程序左右滑动切换页面详解及实例代码
Feb 28 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
Mar 21 Javascript
原生JS写Ajax的请求函数功能
Dec 22 Javascript
浅谈React组件之性能优化
Mar 02 Javascript
jQuery使用bind动态绑定事件无效的处理方法
Dec 11 jQuery
js 将多个对象合并成一个对象 assign方法的实现
Sep 24 Javascript
vue使用video插件vue-video-player详解
Oct 23 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
JS实现php的伪分页
2008/05/25 PHP
PHP容易忘记的知识点分享
2013/04/30 PHP
php获取网页标题和内容函数(不包含html标签)
2014/02/03 PHP
推荐一款MAC OS X 下php集成开发环境mamp
2014/11/08 PHP
php中的explode()函数实例介绍
2019/01/18 PHP
Bootstrap Table使用整理(五)之分页组合查询
2017/06/09 Javascript
js中apply与call简单用法详解
2017/11/06 Javascript
jQuery zTree 异步加载添加子节点重复问题
2017/11/29 jQuery
基于Vue 2.0的模块化前端 UI 组件库小结
2017/12/21 Javascript
Vue cli构建及项目打包以及出现的问题解决
2018/08/27 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
JS前端知识点offset,scroll,client,冒泡,事件对象的应用整理总结
2019/06/27 Javascript
小程序实现左滑删除的效果的实例代码
2020/10/19 Javascript
[02:51]2018年度DOTA2最佳中单位选手-完美盛典
2018/12/17 DOTA
简单介绍Python中的几种数据类型
2016/01/02 Python
Django中使用celery完成异步任务的示例代码
2018/01/23 Python
详解python中的json和字典dict
2018/06/22 Python
python将回车作为输入内容的实例
2018/06/23 Python
Python 实现遥感影像波段组合的示例代码
2019/08/04 Python
Python 转换文本编码实现解析
2019/08/27 Python
分享一个pycharm专业版安装的永久使用方法
2019/09/24 Python
python pyecharts 实现一个文件绘制多张图
2020/05/13 Python
Python pickle模块常用方法代码实例
2020/10/10 Python
PyQt5的QWebEngineView使用示例
2020/10/20 Python
Pytorch 中的optimizer使用说明
2021/03/03 Python
HTML5 和小程序实现拍照图片旋转、压缩和上传功能
2018/10/08 HTML / CSS
html5 canvas 实现光线沿不规则路径运动
2020/04/20 HTML / CSS
GAP欧盟网上商店:GAP EU
2016/09/13 全球购物
AURALog面试题软件测试方面
2013/10/22 面试题
汽车检测与维修应届毕业生求职信
2013/10/19 职场文书
优秀的自荐信要注意哪些
2014/01/03 职场文书
试用期员工考核制度
2014/01/22 职场文书
最经典的大学生职业生涯规划范文
2014/03/05 职场文书
保险公司2016开门红口号集锦
2015/12/24 职场文书
关于感恩的作文
2019/08/26 职场文书
Angular性能优化之第三方组件和懒加载技术
2021/05/10 Javascript