3 javascript闭包学习总结

来源:互联网 发布:mac家装设计软件 编辑:程序博客网 时间:2024/06/04 17:49

闭包几个思想

javascript中有两种作用域,全局和局部,由于局部作用域的存在导致外部无法访问函数内部变量,从而出现了闭包思想。闭包的关键是作为沟通函数内外部的数据桥梁。

//一个实现        function closure() {            var innerVar = 0;            function inner() {                return  ++innerVar;//可以直接修改innervar的值            }            return inner;        }        var quote = closure();        echo(pclosure1, quote());//1        echo(pclosure1, quote());//2

js是函数作用域的,即一个function就是一个局部作用域,innerVar在函数作用域里面。但是希望能操作该内部变量。 那么其内部的函数就可以访问并修改这个局部变量。所以在第二次调用时,第一次调用的结果仍然保存着。

2:闭包中涉及的静态与动态作用于思想

var name = "xiaofu";var person = function(lastname){    var name = 'yang';    function personName(){        return name + lastname;    }    return personName;}var pName = person();pName("xiaoming");

js 中一个function就是一个作用域,所以personName在person这个函数的作用域里面。但是调用的是在这个作用域的外面,那么当personName执行的时候,它里面的name取的是person这个作用域还是最外层的作用域呢?

如果是静态作用域则调用的是person里面的 name, 如果是动态作用域则调用的是外层的name(“xiaofu”);而不是”yang”。

闭包就是用来实现静态作用域的一种方式,即通过闭包将函数和它声明时的作用域保存下来,这样在调用的时候取到的就是声明时所在作用域 而不是调用时的作用域。
this
this则与变量有点不同,即this采用的是类似于动态作用域的情况。js里面一切都是对象,所以函数也都是某个对象的方法,如果没有显示指定则是全局对象window。

var person = {    fullname: function{        console.log(this);    },    printAge: function(){        console.log(this);    }}person.fullname();      //this指向personvar age = person.printAge;age();                  //this指向window(浏览器中)

将person.printAge赋值给age之后,再执行age(),此时age没有显示指定调用对象则默认是window(浏览器环境)。所以this并不是声明所在的环境。

3箭头函数(es6)

es6中新增了箭头函数,箭头函数与通过function声明的函数不同,它的this是使用的声明时上下文中的this.并且不可通过apply, call等改变所以在使用箭头函数时一定要注意this指向问题。

4 闭包的应用—立即执行函数

1:关键立即执行函数本身即是一个闭包
2:闭包可以操作所在函数中的变量(利用这点锁住每次循环的变量值到内存中)
有个网友问了个问题,如下的html,为什么每次输出都是5,而不是点击每个p,就alert出对应的1,2,3,4,5。

<html >     <head>     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />     <title>闭包演示</title>     <script type="text/javascript">     function init() {         var pAry = document.getElementsByTagName("p");         for( var i=0; i<pAry.length; i++ ) {              pAry[i].onclick = function() {              alert(i);         }       }     }     </script>     </head>     <body onload="init();">     <p>产品一</p>     <p>产品二</p>     <p>产品三</p>     <p>产品四</p>     <p>产品五</p>     </body>     </html>     

使用闭包可以解决异步加载问题:,

方法1、将变量 i 保存给在每个段落对象(p)上
“`
function init() {
var pAry = document.getElementsByTagName(“p”);
for( var i=0; i

**方法2、将变量 i 保存在匿名函数自身**  ```function init2() {       var pAry = document.getElementsByTagName("p");       for( var i=0; i<pAry.length; i++ ) {          (pAry[i].onclick = function() {             alert(arguments.callee.i);         }).i = i;       }     }     

方法3、加一层闭包,i以函数参数形式传递给内层函数

function init3() {       var pAry = document.getElementsByTagName("p");       for( var i=0; i<pAry.length; i++ ) {        (function(arg){                pAry[i].onclick = function() {                   alert(arg);            };        })(i);//调用时参数       }     }     

方法4、加一层闭包,i以局部变量形式传递给内存函数

function init4() {       var pAry = document.getElementsByTagName("p");       for( var i=0; i<pAry.length; i++ ) {           (function () {           var temp = i;//调用时局部变量           pAry[i].onclick = function() {               alert(temp);             }         })();       }     }     

方法5、加一层闭包,返回一个函数作为响应事件(注意与3的细微区别)

function init5() {       var pAry = document.getElementsByTagName("p");       for( var i=0; i<pAry.length; i++ ) {          pAry[i].onclick = function(arg) {            return function() {//返回一个函数            alert(arg);          }        }(i);       }     }    

方法6、用Function实现,实际上每产生一个函数实例就会产生一个闭包

function init6() {         var pAry = document.getElementsByTagName("p");         for( var i=0; i<pAry.length; i++ ) {             pAry[i].onclick = new Function("alert(" + i + ");");//new一次就产生一个函数实例        }     }    

方法7、用Function实现,注意与6的区别

function init7() {         var pAry = document.getElementsByTagName("p");         for( var i=0; i<pAry.length; i++ ) {              pAry[i].onclick = Function('alert('+i+')')        }     }     
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 安装拼多多显示校验失败怎么办 中央庭黑盒被抢怎么办 lab值a值偏高怎么办 橱房管道堵死了怎么办 微信被别的手机同步登录怎么办 计算机机房空调坏了怎么办 被蝎子蛰了怎么办怎么处理? 月嫂走了孩子闹怎么办 转业军人自建房有困难怎么办 转业军人没配偶想异地安置怎么办 转业军人档案和身份证不符怎么办 转业军人个人资被单位遗失怎么办 空军飞行学员停飞后怎么办 2020年不脱贫的农户怎么办 马自达8停产后配件怎么办 钢铁雄心3没将领怎么办 江苏低于二本线怎么办 电工证快过期了怎么办 天正建筑打不开高版本的图纸怎么办 打开天正只显示cad怎么办 天正软件显示过期了怎么办 四岁宝宝经常吐怎么办 穿越火线登陆不上去怎么办 猫猫呕吐带血怎么办 狗又吐又拉稀怎么办 狗狗肠炎拉血怎么办 拉大便有血怎么办呢 工作中遇到不公待遇怎么办 老兵丢了退伍证怎么办 我的退伍证丢了怎么办 退伍证丢了怎么办啊 银行卡更换之前的卡号怎么办 收到联通欠费催款律师函怎么办 苹果5s玩王者卡怎么办 电信宽带包年用户欠费怎么办 员工不处理考勤异常怎么办 移动号码特殊原因强制停机怎么办 下雨天我怎么办我好想你 免检标志领晚了怎么办 激光点太田痣揉搓了泛红怎么办 花束与衣服颜色相称怎么办