您当前的位置:首页 > 生活热点 > 正文

浅释Javascript的闭包

导读: 浅释Javascript的闭包--以下为个人理解。 “闭包(closure)”,是函数和数据的封装,相称于“对象”。只是在javascript里,形式上和c++有很大的不同。 在js中,当出现函数嵌套时,我把外层的称为母函数,内层的称为子函数。 1、母函数... 浅释Javascript的闭包 以下为个人理解。 “闭包(closure)”,是函数和数据的封装,相称于“对象”。只是在javascript里,形式上和c++有很大的不同。 在js中,当出现函数嵌套时,我把外层的称为母函数,内层的称为子函数。 1、母函数function即相称于class。 2、母函数内的子函数,用return返回,即相称于成员函数。 3、没有用return返回的,即相称于私有函数。 4、数据为私有变量。 当母函数被执行后,它的整体,包括子函数、初始化参数就保留在了内存中,即相称于创建了一个对象。这就是所谓的“闭包”。 1、只返回一个匿名成员函数的情况,闭包即函数 function myFunc(初始参数) { return function(动态参数){ ... } function privatefunc(...){ } }实例化:var myClosure1= myFunc(初始化参数1);var myClosure2= myFunc(初始化参数2);调用时无需写成员函数名:myClosure1(动态参数1);myClosure2(动态参数2); 2、成员函数著名称的情况,成员函数可以返回一个或多个,调用时和使用对象一样了: var makeCounter = function() { var privateCounter = 0; function changeBy(val) { //私有函数 privateCounter += val; } return { increment: function() { changeBy(1); }, decrement: function() { changeBy(-1); }, value: function() { return privateCounter; } }};var Counter1 = makeCounter();var Counter2 = makeCounter();console.log(Counter1.value()); /* 0 */Counter1.increment();Counter1.increment();console.log(Counter1.value()); /* 2 */Counter1.decrement();console.log(Counter1.value()); /* 1 */console.log(Counter2.value()); /* 0 */同样可使用初始化参数和动态参数。 3、假如只需要一个实例,可以用“立刻执行函数”来定义和初始化 var myClosure = function(初始参数名) { return function(动态参数名){ ... }}(初始参数值);调用:myClosure(动态参数); 4、在循环体中初始化回调函数时,每个循环要传入不同值的初始化参数,可使用闭包。回调函数相称于子函数。假如不使用闭包for(var x=0;x<max;x++){onmousedown=function(e){console.log(x);}}当它被触发时,它去读取母体中x的值,这时候x=max。所以,for(var x=0;x<max;x++){onmousedown=function(x){return function(e){console.log(x);}}(x);}每次循环都产生一个闭包,保存了不同的x。也可以使用let或foreach达到同样的效果。 参考文章: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 李理谦:住宅风水之哪些情况属于风煞?有什么危害?怎样化解?

下一篇: 长沙地铁2号线运营时间,长沙地铁2号线地铁运营时间



推荐阅读