JavaScript备忘录-闭包(2)

闭包的定义javascript

闭包是指函数有自由独立的变量。换句话说,定义在闭包中的函数能够“记忆”它建立时候的环境。java

闭包的浅显理解数组

function makeFunc() {
  var name = "Mozilla";
  function displayName() {
    alert(name);
  }
  return displayName;
}

var myFunc = makeFunc();
myFunc();

这段代码看起来别扭却能正常运行。一般,函数中的局部变量仅在函数的执行期间可用。一旦 makeFunc() 执行事后,咱们会很合理的认为 name 变量将再也不可用。虽然代码运行的没问题,但实际并非这样的。安全

这个谜题的答案是 myFunc 变成一个 闭包 了。 闭包是一种特殊的对象。它由两部分构成:函数,以及建立该函数的环境。环境由闭包建立时在做用域中的任何局部变量组成。在咱们的例子中,myFunc 是一个闭包,由 displayName 函数和闭包建立时存在的 "Mozilla" 字符串造成。闭包

为了更好滴理解这句话,简单的看下图:函数

闭包能够实现私有变量。this

function Animal(type) {
    var data = [];
    data['type'] = type;
    this.getType = function () {
        return data['type'];
    }
}
var fluffy = new Animal('dog');
fluffy.getType(); // 返回 'dog'

在这个例子中,Animal类中建立了一个本地数组data。当 Animal对象被实例化时,传递了一个type的值并将该值放置在data数组中。由于它是私有的,因此该值没法被覆盖(Animal函数定义了它的范围)。一旦对象被实例化了,读取type值的惟一方式是调用getType方法。由于getType是在Animal中定义的,所以凭借Animal产生的闭包,getType能够进到data中。这样的话,虽能够读到对象的类型却没法改变。这有点相似C#中的拥有私有的set访问器并经过构造函数来实现注入的属性。从这个意义上来说,javascript的函数就是闭包。spa

闭包的做用code

简单地来讲就是围绕着它的定义来的:对象

1.能够保存独立的变量。由于是闭包的内部函数的做用域只是存在于函数的内部,因此能够保证变量的安全。

2.定义在闭包中的函数能够“记忆”它建立时候的环境。通俗的讲就是当闭包中的函数被赋值给闭包外部的变量的时候,它的引用就指向了外部的临时变量。只要这种引用关系一直存在,闭包建立时的环境就会被保存起来。 就能间接保持原构造函数体当时用到的临时变量值。

相关文章
相关标签/搜索