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 相关文章推荐
JavaScript flash复制库类 Zero Clipboard
Jan 17 Javascript
排序算法的javascript实现与讲解(99js手记)
Sep 28 Javascript
node.js中的fs.fstatSync方法使用说明
Dec 15 Javascript
详解JavaScript中setSeconds()方法的使用
Jun 11 Javascript
js实现二级菜单渐隐显示
Nov 03 Javascript
详解JavaScript中this关键字的用法
May 26 Javascript
jQuery插件编写步骤详解
Jun 03 Javascript
Javascript中toFixed计算错误(依赖银行家舍入法的缺陷)解决方法
Aug 22 Javascript
element el-input directive数字进行控制
Oct 11 Javascript
JS与SQL方式随机生成高强度密码示例
Dec 29 Javascript
微信小程序getLocation 需要在app.json中声明permission字段
Mar 03 Javascript
Threejs实现滴滴官网首页地球动画功能
Jul 13 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
雄兵连三大错觉:凯莎没了,凉冰阵亡了,华烨觉得自己又行了
2020/04/09 国漫
基于mysql的论坛(2)
2006/10/09 PHP
PHP生成Flash动画的实现代码
2010/03/12 PHP
smarty模板嵌套之include与fetch性能测试
2010/12/05 PHP
PHP中simplexml_load_string函数使用说明
2011/01/01 PHP
学习php过程中的一些注意点的总结
2013/10/25 PHP
使用PHP函数scandir排除特定目录
2014/06/12 PHP
php随机取mysql记录方法小结
2014/12/27 PHP
帝国cms常用标签汇总
2015/07/06 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
2016/06/15 PHP
Laravel框架实现的批量删除功能示例
2019/01/16 PHP
JavaScript URL参数读取改进版
2009/01/16 Javascript
基于jQuery的简单九宫格实现代码
2012/08/09 Javascript
漂亮的jquery提示效果(仿腾讯弹出层)
2013/02/05 Javascript
IE6下javasc#ipt:void(0) 无效的解决方法
2013/12/23 Javascript
Angular.js中angular-ui-router的简单实践
2017/07/18 Javascript
使用Bootrap和Vue实现仿百度搜索功能
2017/10/26 Javascript
vue项目打包部署到服务器的方法示例
2018/08/27 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
2018/09/04 Javascript
js中获取URL参数的共用方法getRequest()方法实例详解
2018/10/24 Javascript
node实现生成带参数的小程序二维码并保存到本地功能示例
2018/12/05 Javascript
vue实现随机验证码功能的实例代码
2019/04/30 Javascript
如何修改Vue打包后文件的接口地址配置的方法
2020/04/22 Javascript
利用Python获取操作系统信息实例
2016/09/02 Python
python二进制文件的转译详解
2019/07/03 Python
Django对数据库进行添加与更新的例子
2019/07/12 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
2020/07/03 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
2020/10/31 Python
德国柯吉澳趣味家居:Koziol
2017/08/24 全球购物
师范生实习自我鉴定
2013/11/01 职场文书
查环查孕证明
2014/01/10 职场文书
电子商务系毕业生自荐信
2014/05/29 职场文书
幼儿园安全教育月活动总结
2015/05/08 职场文书
小学秋季运动会加油口号及加油稿
2019/08/19 职场文书
前端学习——JavaScript原生实现购物车案例
2021/03/31 Javascript
一文搞懂redux在react中的初步用法
2021/06/09 Javascript