js闭包

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js闭包相关的知识,希望对你有一定的参考价值。

2017-03-23

文章来源:http://www.cnblogs.com/daysme

变量分为全局变量和局部变量。
他们之前是用函数隔开的。
除了函数,其他都没有作用域之说。

全局变量:可重用。易被污染。
局部变量:不会被污染,不能重用。
闭包:既能重用变量,又能保护变量不被污染。
  在函数内声明一个函数,并把这个函数返回出来。
  闭包就是能读取其他函数内局部变量的函数。因为只有函数内部的子函数才能读取局部变量,
  因为可以把闭包理解为定义在一个函数内部的函数。

闭包的作用:
  一个是可以读取函数内部的局部变量。
  一个是让这些变量始终保存在内存中。

全局变量
var n=1;
function fn(){
  console.log(n);
}
fn();

局部变量
function fn(){
  var n=1;
}
fn();
console.log(n); //获取不到变量,并报错

返回变量-最初的闭包思想
function fn(){
  var n=1;
  return 1;
}
var a=fn();
console.log(a);

闭包,其实就是一种函数。
function fn(){
  var n=1;
  return function(){
    console.log(n)
  };
}
var a=fn();
a();

例子:
function fn(){
  var n=1;
  add=function(){
    n++;
  }
  function fn1(){
    console.log(n); //获取变量
  }
  return fn1; //返回出来
}
var result=fn(); //保存到全局变量中
result();
add();
result();

此时 fn 中的局部就是一直保存在内存中,并没有在fn被调用后销毁。
为什么没有被销毁?因为 fn1() 被返回出来并且由全局变量接收保存了,
全局变量result是不会被销毁的,但result的值是fn1,fn1的值引用着 fn() 中的 n ,所以 fn 也不会被删除。

闭包三个步:
  1.外层函数包裹着受保护的变量和操作变量的内层函数。
  2.外层函数把内层函数返回到函数外。
  3.使用者调用外层函数,获得内层函数。
  此时被返回出来的函数就叫闭包。

闭包形成的原因:
  外层函数的作为域对象无法释放。

例,没用到上层函数的任何东西。
var name=\'the window\';
var objcet={
  name:\'my objcet\',
  getname:function(){
    return function(){
      return this.name;
    }
  }
}
console.log(objcet.getname()());

例, 指向obj的this 已经保存在内存中。
var name=\'the window\';
var objcet={
  name:\'my objcet\',
  getname:function(){
    var that=this;
    return function(){
      return that.name;
    }
  }
}
console.log(objcet.getname()());

 

以上是关于js闭包的主要内容,如果未能解决你的问题,请参考以下文章

JS闭包的概念

(原创)JS闭包看代码理解

关于JS闭包

js闭包的作用

js闭包

js的闭包