发表于: 2021-04-20 20:44:02

1 1559


今天完成的事情:

学习闭包

闭包

一个函数和对其周围状态的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来


词法作用域

function init() {
    var name = "Mozilla"// name 是一个被 init 创建的局部变量
    function displayName() { // displayName() 是内部函数,一个闭包
        alert(name); // 使用了父函数中声明的变量
    }
    displayName();
}
init();


变量的作用域

Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量


从外部读取局部变量

在函数的内部,再定义一个函数

  function f1(){
    var n=9;
    function f2(){
      alert(n); // 9
    }
  }


闭包的用途

一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中

        function f1() {
            var n = 1;
            nAdd = function () { n += 1 }
            function f2() {
                alert(n);
            }
            return f2;
        }
        var result = f1();
        result(); // 1
        nAdd();
        result(); // 2


闭包的特点

1.由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除

2.闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性,不要随便改变父函数内部变量的值。



问题:

关于闭包和this不是太理解,如:这两者的区别

  var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      return function(){
        return this.name;
      };
    }
  };
  alert(object.getNameFunc()()); //The Window

  var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      var that = this;
      return function(){
        return that.name;
      };
    }
  };
  alert(object.getNameFunc()()); //My Object



返回列表 返回列表
评论

    分享到