javascript 闭包
这段代码看起来别扭却能正常运行。通常,函数中的局部变量仅在函数的执行期间可用。一旦 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:柯里化
相关文章
- javascript 基础_JavaScript高级编程
- 20·灵魂前端工程师养成-JavaScript对象
- Javascript之我也来手写一下Promise
- 前端JavaScript小技巧[建议收藏]
- 「 1.JavaScript的编写位置: 」
- javascript你必须要知道的——作用域和闭包
- 轻松学习 JavaScript——第 3 部分:函数中的默认参数详解编程语言
- JavaScript学习总结(五)——Javascript中==和===的区别详解编程语言
- (转载)JavaScript中匿名函数,函数直接量和闭包
- Javascript常用运算符(Operators)-javascript基础教程
- javascript避免闭包引发的问题
- Javascript阻止javascript事件冒泡,获取控件ID值
- 网页禁用右键实现代码(JavaScript代码)
- JavaScript设计模式富有表现力的Javascript(一)
- Javascript闭包演示代码小结
- 用JavaScript获取DOM元素位置和尺寸大小的方法
- 深入Javascript函数、递归与闭包(执行环境、变量对象与作用域链)使用详解
- 怎么清空javascript数组
- JavaScript自执行闭包的小例子
- 如何使用Javascript获取距今n天前的日期
- javascript中call和apply方法浅谈
- 深入理解Javascript里的依赖注入
- 深入理解javascript的执行顺序
- javascript闭包入门示例
- JavaScript中的闭包(Closure)详细介绍
- javascript实现全角与半角字符的转换