闭包

1. 变量的做用域复习

变量根据做用域的不一样分为两种:全局变量和局部变量。闭包

  1. 函数内部能够使用全局变量。函数

  2. 函数外部不能够使用局部变量。this

  3. 当函数执行完毕,本做用域内的局部变量会销毁。atom

2. 什么是闭包

闭包(closure)指有权访问另外一个函数做用域中变量的函数。简单理解就是 ,一个做用域能够访问另一个函数内部的局部变量。 spa

 

 

3. 闭包的做用

做用:延伸变量的做用范围。blog

 function fn() {
  var num = 10;
  function fun() {
      console.log(num);
}
   return fun;
}
var f = fn();
f();

4. 闭包的案例

  1. 利用闭包的方式获得当前li 的索引号索引

for (var i = 0; i < lis.length; i++) {
// 利用for循环建立了4个当即执行函数
// 当即执行函数也成为小闭包由于当即执行函数里面的任何一个函数均可以使用它的i这变量
(function(i) {
   lis[i].onclick = function() {
     console.log(i);
  }
})(i);
}
  1. 闭包应用-3秒钟以后,打印全部li元素的内容作用域

 for (var i = 0; i < lis.length; i++) {
  (function(i) {
    setTimeout(function() {
    console.log(lis[i].innerHTML);
    }, 3000)
  })(i);
}
  1. 闭包应用-计算打车价格 get

/*需求分析
打车起步价13(3千米内), 以后每多一千米增长 5块钱. 用户输入千米数就能够计算打车价格
若是有拥堵状况,总价格多收取10块钱拥堵费*/

var car = (function() {
    var start = 13; // 起步价 局部变量
    var total = 0; // 总价 局部变量
    return {
      // 正常的总价
      price: function(n) {
        if (n <= 3) {
          total = start;
        } else {
          total = start + (n - 3) * 5
        }
        return total;
      },
      // 拥堵以后的费用
      yd: function(flag) {
        return flag ? total + 10 : total;
      }
}
})();
console.log(car.price(5)); // 23
console.log(car.yd(true)); // 33

5. 案例

 var name = "The Window";
  var object = {
    name: "My Object",
    getNameFunc: function() {
    return function() {
    return this.name;
    };
  }
};
console.log(object.getNameFunc()())
-----------------------------------------------------------------------------------
var name = "The Window";  
 var object = {    
   name: "My Object",
   getNameFunc: function() {
   var that = this;
   return function() {
   return that.name;
  };
}
};
console.log(object.getNameFunc()())
相关文章
相关标签/搜索