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的direction图片渐变动画效果
May 24 Javascript
js时间日期和毫秒的相互转换
Feb 22 Javascript
15个jquery常用方法、小技巧分享
Jan 13 Javascript
了解Javascript的模块化开发
Mar 02 Javascript
jQuery选择器源码解读(二):select方法
Mar 31 Javascript
纯javascript代码实现计算器功能(三种方法)
Sep 07 Javascript
jQuery中通过ajax的get()函数读取页面的方法
Feb 29 Javascript
JavaScript字符串对象
Jan 14 Javascript
jQuery菜单实例(全选,反选,取消)
Aug 28 jQuery
JS中图片压缩的方法小结
Nov 14 Javascript
微信小程序基于slider组件动态修改标签透明度的方法示例
Dec 04 Javascript
微信小程序ibeacon三点定位详解
Oct 31 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无限极分类递归排序实现方法
2014/11/11 PHP
PHP的PDO操作简单示例
2016/03/30 PHP
PHP+JS实现的商品秒杀倒计时用法示例
2016/11/15 PHP
用javascript实现在小方框中浏览大图的代码
2007/08/14 Javascript
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
2010/02/07 Javascript
JS+CSS实现一个气泡提示框
2013/08/18 Javascript
jquery ajax属性async(同步异步)示例
2013/11/05 Javascript
vue.js实现价格格式化的方法
2017/05/23 Javascript
jQuery ajax读取本地json文件的实例
2017/10/31 jQuery
JavaScript多态与封装实例分析
2018/07/27 Javascript
微信小程序使用wxParse解析html的方法示例
2019/01/17 Javascript
用js简单提供增删改查接口
2019/05/12 Javascript
Element实现表格分页数据选择+全选所有完善批量操作
2019/06/07 Javascript
jquery实现图片放大镜效果
2020/12/23 jQuery
python发送arp欺骗攻击代码分析
2014/01/16 Python
python实现数独算法实例
2015/06/09 Python
基于Python列表解析(列表推导式)
2018/06/23 Python
python 数字类型和字符串类型的相互转换实例
2018/07/17 Python
Python简单读写Xls格式文档的方法示例
2018/08/17 Python
Python干货:分享Python绘制六种可视化图表
2018/08/27 Python
Python自动发送邮件的方法实例总结
2018/12/08 Python
Appium Python自动化测试之环境搭建的步骤
2019/01/23 Python
django实现将修改好的新模型写入数据库
2020/03/31 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
HTML如何让IMG自动适应DIV容器大小的实现方法
2020/02/25 HTML / CSS
澳大利亚药房在线:ThePharmacy
2017/10/04 全球购物
联想阿根廷官方网站:Lenovo Argentina
2019/10/14 全球购物
优秀应届生推荐信
2013/11/09 职场文书
工作过失检讨书
2014/02/23 职场文书
毕业自我鉴定总结
2014/03/24 职场文书
《称象》教学反思
2014/04/25 职场文书
意外伤害赔偿协议书
2014/09/16 职场文书
工作散漫检讨书
2014/09/16 职场文书
导师鉴定意见
2015/06/05 职场文书
游戏《东方异文石:爱亚利亚黎明》正式版发布
2022/04/03 其他游戏
css之clearfix的用法深入理解(必看篇)
2023/05/21 HTML / CSS