资讯专栏INFORMATION COLUMN

javascript闭包摘要

FrancisSoung / 1412人阅读

摘要:另一个更有意思的例子以上例子中和都是闭包,它们共享了相同的函数定义,但保存了不同的词法环境。闭包允许将函数和其操作的某些数据环境关联起来。

摘自MDN:https://developer.mozilla.org...

闭包是函数和申明该函数的词法环境的组合,这个环境包含了这个闭包创建时所能访问到的所有局部变量

function makeFunc() {
var name = "Mozilla";
function displayName() {
alert(name);
}
return displayName;
}
var myFunc = makeFunc();
myFunc(); //alert("Mozilla")
在上面的例子中,调用myFun函数能正常执行,是因为在displayName函数中形成了闭包,包含了创建diaplayName函数时能访问到的局部变量name。

另一个更有意思的例子

function makeAdder(x) {
return function(y) {
return x + y;
};}

var add5 = makeAdder(5);
var add10 = makeAdder(10);

console.log(add5(2)); // 7
console.log(add10(2)); // 12
以上例子中add5和add10都是闭包,它们共享了相同的函数定义,但保存了不同的词法环境。

闭包允许将函数和其操作的某些数据(环境)关联起来。

1. 对只有一个方法的对象可以使用闭包

2. 可以用闭包模拟私有方法:私有方法不仅能限制对代码的访问,还提供了管理全局命名空间的能力,避免非核心的方法弄乱代码的公共接口部分

下面这个例子使用闭包定义公共函数,并令其可以访问私有函数和变量,这个方式也称为模块模式:

var Counter = (function() {
var privateCounter = 0;
function changeBy(val) {
privateCounter += val;
}
return {
increment: function() {
changeBy(1);
},
decrement: function() {
changeBy(-1);
},
value: function() {
return privateCounter;
}
}
})();

console.log(Counter.value()); /* logs 0 */
Counter.increment();
Counter.increment();
console.log(Counter.value()); /* logs 2 */
Counter.decrement();
console.log(Counter.value()); /* logs 1 */
该共享环境建立于一个立即执行的匿名函数体内。这个环境中包含两个私有项:privateCounter变量和changeBy函数,这两项都无法在匿名函数外直接访问,必须通过返回的三个公共函数进行访问。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92919.html

相关文章

  • JavaScript高级程序设计-摘要笔记-5

    摘要:函数表达式和闭包函数声明的一个重要特征是函数声明提升如递归递归函数是在一个函数通过名字调用自身的情况下构成的。注意中已经是块级作用域了,所以这些东西感觉实际用途没有那么大,但是对理解闭包对作用域链中的属性的引用,这一点还是有作用的。 函数表达式和闭包 1. 函数声明的一个重要特征是函数声明提升 如: sayHi() function sayHi () { console.log(h...

    JerryWangSAP 评论0 收藏0
  • 《你不知道的JavaScript》 (上) 阅读摘要

    摘要:但是如果非全局的变量如果被遮蔽了,无论如何都无法被访问到。但是如果引擎在代码中找到,就会完全不做任何优化。结构的分句中具有块级作用域。第四章提升编译器函数声明会被提升,而函数表达式不会被提升。 本书属于基础类书籍,会有比较多的基础知识,所以这里仅记录平常不怎么容易注意到的知识点,不会全记,供大家和自己翻阅; 上中下三本的读书笔记: 《你不知道的JavaScript》 (上) 读书笔记...

    FingerLiu 评论0 收藏0
  • 那些年,前端学习之路的疑难杂症(四):面试中遇到的3个问题概览

    摘要:闭包能用来实现私有化和创建工厂函数等作用。关于闭包的常见面试题是这样的写一个函数,循环一个整数数组,延迟秒打印这个数组中每个元素的索引。 文章来源:http://mp.weixin.qq.com/s/vs0... 前言 在公众号上看到了这篇文章,觉得很有用,有助于理解JS学习中的一些重点难点。决定把它整理下发布出来。该文章主要介绍了JS中的三个问题。在以后的几篇文章里,我会详细介绍这三...

    gecko23 评论0 收藏0
  • [译] addEventListener 与 onclick,孰优孰劣?

    摘要:上面的例子应用了匿名函数这个特性,还可以使用构造函数或者闭包来添加事件监听器另一个重要特性,则是上面这段代码中最后一行的最后一个参数,用来控制监听器对于冒泡事件的响应。在这里你不能使用闭包或者匿名函数,并且控制域也是有限的。 原文出处:addEventListener vs onclick 之所以会想到这个话题,是因为在回顾自己之前写的为 button 动态绑定事件的函数时,脑海里忽...

    wums 评论0 收藏0
  • 2017拼多多前端笔试

    摘要:但是如果一个值不再用到了,引用次数却不为,垃圾回收机制却无法释放这块内存,从而导致内存泄漏。内存泄漏垃圾回收语言的内存泄漏主因是不需要的引用。常见内存泄漏意外的全局变量处理未定义变量的方式比较宽松未定义的变量会在全局对象创建一个新变量。 简答题: settimeout 与 setInterval的区别, 及对他们的内存的分析 区别 setTimeout是在一段时间后调用指定函数(仅一...

    Jioby 评论0 收藏0

发表评论

0条评论

FrancisSoung

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<