码迷,mamicode.com
首页 > Web开发 > 详细

js闭包

时间:2017-03-23 19:52:42      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:作用域   class   pre   内存   操作   div   存在   href   blank   

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闭包

标签:作用域   class   pre   内存   操作   div   存在   href   blank   

原文地址:http://www.cnblogs.com/daysme/p/6606962.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!