javascript学习日记之闭包

闭包是学习javascript重点,最初接触到闭包时感觉到有点困难。当然学习闭包也是非常重要一个环节。

  • 词法作用域
  • 闭包
  • 闭包模拟私有方法

1.词法作用域
每个函数在创建时都会有个自己的环境,也就是词法作用域。比如:

function f1 () {
   var a = 1;
   f2();
}
function f2 {
    return  a;
}

从上述代码看出,我们分别创建两个函数f1和f2
f1函数中 定义个局部变量a和 执行f2函数 。f2函数里简单的返回a的值 。

f1(); //a  is not defined

因为f1和f2函数只能访问自身作用域和全局作用域里的内容。所以f1函数 并不能访问f2函数里的内容 也就是说f1和f2函数不存在共享词法作用域。

2.闭包
那么如何访问到其他作用域里的内容呢?
这时候就用闭包了
闭包是指那些能够访问独立(自由)变量的函数 (变量在本地使用,但定义在一个封闭的作用域中)
最常见创建闭包就是函数内部再创建一个函数,比如

function fn1() {
  var name = "zhanglei";
  function fn2() {
    alert(name);
  }
  return fn2
}
var a = fn1();
a();

3.闭包模拟私有方法
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 */

这里有个细节就是利用了全局命名空间,以避免非核心的方法弄乱了代码的公共接口部分。
首先创建了一个自调函数 定义了一个私有变量和一个私有方法 然后返回了 三个公共函数 因为这三个公共函数是共享同一个环境的闭包。所以都可以访问 privateCounter 变量和 changeBy 函数。

你可能感兴趣的:(javascript学习日记之闭包)