zl程序教程

您现在的位置是:首页 >  前端

当前栏目

javascript 闭包

JavaScript 闭包
2023-09-14 09:01:03 时间

这段代码看起来别扭却能正常运行。通常,函数中的局部变量仅在函数的执行期间可用。一旦 makeFunc() 执行过后,我们会很合理的认为 name 变量将不再可用。不过,既然代码运行的没问题,显然不是我们想象的那样。在我们的例子中,myFunc 是一个闭包,由 displayName 函数和闭包创建时存在的 "Mozilla" 字符串形成。

这就是闭包,我们在返回函数的时候,也将函数的环境一并返回了。

闭包的用途

响应事件而执行的函数


诸如 Java 在内的一些语言支持将方法声明为私有的,既它们只能被同一个类中的其它方法所调用。

对此,JavaScript 并不提供原生的支持,但是可以使用闭包模拟私有方法。私有方法不仅仅有利于限制对代码的访问:还提供了管理全局命名空间的强大能力,避免非核心的方法弄乱了代码的公共接口部分。


{id: email, help: Your e-mail address}, {id: name, help: Your full name}, {id: age, help: Your age (you must be over 16)} for (var i = 0; i  helpText.length; i++) {

该问题的原因在于赋给 onfocus 的函数是闭包;它们由函数定义和记录自 setupHelp 函数作用域的环境构成。一共创建了三个闭包,但是它们都共享同一个环境。在 onfocus 的回调被执行时,循环早已经完成,且此时 item 变量(由所有三个闭包所共享)已经指向了 helpText 列表中的最后一项。

 

修正


{id: email, help: Your e-mail address}, {id: name, help: Your full name}, {id: age, help: Your age (you must be over 16)} for (var i = 0; i  helpText.length; i++) {

这段代码可以如我们所期望的那样工作。所有的回调不再共享同一个环境, makeHelpCallback 函数为每一个回调创建一个新的环境。在这些环境中,help 指向 helpText 数组中对应的字符串。

 

参考:https://developer.mozilla.org/zh-CN/docs/JavaScript/Guide/Closures

 

 

 

本文出自 “简单” 博客,请务必保留此出处http://dba10g.blog.51cto.com/764602/1357820


JS闭包之灵魂7问 Q1:慧眼认“包” Q2: 参数为何凭空消失 Q3:作用域嵌套惹的祸 Q4:迟到的兑现,错误的值 Q5:变量的从一而终 Q6:公私分明 Q7:柯里化