js中闭包及如何用闭包定义私有产量

2017-09-15  本文已影响0人  清白NLY

1、闭包

对于闭包(closure),当外部函数返回之后,内部函数依然可以访问外部函数的变量。

function f1()

{

    var N = 0; // N是f1函数的局部变量

    function f2() // f2是f1函数的内部函数,是闭包

    {

        N += 1; // 内部函数f2中使用了外部函数f1中的变量N

        console.log(N);

    }

    return f2;

}

var result = f1();

result(); // 输出1

result(); // 输出2

result(); // 输出3

代码中,外部函数f1只执行了一次,变量N设为0,并将内部函数f2赋值给了变量result。由于外部函数f1已经执行完毕,其内部变量N应该在内存中被清除,然而事实并不是这样:我们每次调用result的时候,发现变量N一直在内存中,并且在累加。为什么呢?这就是闭包的神奇之处了。

2、使用闭包定义私有变量

通常,JavaScript开发者使用下划线作为私有变量的前缀。但是实际上,这些变量依然可以被访问和修改,并非真正的私有变量。这时,使用闭包可以定义真正的私有变量:

function Product() {

  var name;

    this.setName = function(value) {

        name = value;

    };

    this.getName = function() {

        return name;

    };

}

var p = new Product();

p.setName("Fundebug");

console.log(p.name); // 输出undefined

console.log(p.getName()); // 输出Fundebug

代码中,对象p的的name属性为私有属性,使用p.name不能直接访问。

上一篇下一篇

猜你喜欢

热点阅读