乐趣区

关于javascript:JavaScript的闭包closure是什么

一、闭包是什么?

闭包(closure)就是通过嵌套函数的形式,缓存嵌套函数及其执行环境,期待下一次调用。直观的说就是造成一个不销毁的栈环境。这样能够爱护变量和办法,使其私有化。


1、私有化变量
function makeFunc() {
    var name = "Mozilla";
    function displayName() {alert(name);
    }
    return displayName;
}
// 闭包暗藏了变量 name,myFunc 无奈间接拜访
var myFunc = makeFunc();

// 只能通过执行闭包,来拜访 name
myFunc();
2、缓存执行环境
function makeAdder(x) {return function (y) {return x + y;};
}

// 闭包的执行环境被缓存,也就是 x 的值和嵌套函数被缓存在 add5
var add5 = makeAdder(5);

// 调用执行闭包,输入后果:7
console.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 和 getMessage
function 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 和 getMessage
function 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) 是什么?
退出移动版