一、闭包是什么?
闭包(closure)就是通过嵌套函数的形式,缓存嵌套函数及其执行环境,期待下一次调用。直观的说就是造成一个不销毁的栈环境。这样能够爱护变量和办法,使其私有化。
1、私有化变量
function makeFunc() { var name = "Mozilla"; function displayName() { alert(name); } return displayName;}// 闭包暗藏了变量name,myFunc无奈间接拜访var myFunc = makeFunc();// 只能通过执行闭包,来拜访namemyFunc();
2、缓存执行环境
function makeAdder(x) { return function (y) { return x + y; };}// 闭包的执行环境被缓存,也就是x的值和嵌套函数被缓存在add5var add5 = makeAdder(5);// 调用执行闭包,输入后果:7console.log(add5(2));
3、数据封装与暗藏
JavaScript中没有Java中private关键字,但能够用闭包来实现,做到对数据的暗藏和封装。
// 胜利的暗藏了 变量(privateCounter) 和 办法(changeBy)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()); /* logs 0 */Counter1.increment();Counter1.increment();console.log(Counter1.value()); /* logs 2 */Counter1.decrement();console.log(Counter1.value()); /* logs 1 */console.log(Counter2.value()); /* logs 0 */
4、性能优化
如果不是非凡需要,在函数中创立函数是不明智的,因为闭包须要耗费更多CPU和内存资源,对脚本性能有负面影响。当创立新的对象时,应该在 prototype 中定义方法,而不是对象结构器。因为每一次创建对象,都要从新赋值结构器中的办法。
// 比拟蹩脚的应用闭包的形式,// 因为每一次 new MyObject,都会从新赋值getName和getMessagefunction MyObject(name, message) { this.name = name.toString(); this.message = message.toString(); this.getName = function () { return this.name; }; this.getMessage = function () { return this.message; };}
// 举荐应用这种形式,代替下面。// prototype 是所有MyObject对象共享的,无需从新赋值getName和getMessagefunction MyObject(name, message) { this.name = name.toString(); this.message = message.toString();}MyObject.prototype.getName = function () { return this.name;};MyObject.prototype.getMessage = function () { return this.message;};
二、参考文档:
- JavaScript的闭包(closure)是什么?