javascript闭包
2018-12-19 本文已影响112人
前端来入坑
闭包是什么
- 简单来说闭包就是一个函数里面嵌套另一个函数。
说的具体点,引用下面参考博客中的解释:即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。
闭包的词法作用域
- 闭包让javascript拥有自己的私有变量
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 */
实用的闭包
- 闭包很有用,因为它允许将函数与其所操作的某些数据(环境)关联起来。这显然类似于面向对象编程。在面向对象编程中,对象允许我们将某些数据(对象的属性)与一个或者多个方法相关联。
- 因此,通常你使用只有一个方法的对象的地方,都可以使用闭包。
在写js的时候都会用这样一个匿名自执行函数包裹起来(function(){ })()
,就是为了让里面定义的变量成为局部变量,不影响全局的变量。避免使用过多的闭包,可以用let关键词。
- 闭包与面向对象编程。
js面向对象之组合继承
js面向对象的方法
JavaScript多重继承
ES6的继承
面向对象学习网站
性能考量
如果不是某些特定任务需要使用闭包,在其它函数中创建函数是不明智的,因为闭包在处理速度和内存消耗方面对脚本性能具有负面影响。
MDN官网https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures