个人头像

柠檬酸

1月前来过

控制台
欢迎来到我的博客!
默认封面

00:00/

播放列表

javascript笔记-对闭包的小小理解

发布于2017-09-25 / 416次浏览

函数作用域

要理解闭包,首先要了解变量的作用域。
就像我在之前的博客写的那样 js定义变量时,有var关键字和没var关键字有什么差别?
简单的说就是,
函数外部有var和没有var都表示全局变量,因为他们都是在全局环境里执行。
函数内部加var定义的变量是局部变量,不加var定义的就成了全局变量。
而且函数内部可以直接读取全局变量:

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

另一方面,在函数外部自然无法读取函数内的局部变量。

function f1(){
  var n=999;
}
  alert(n); // error

那么如何从外部读取局部变量呢?我们可以运用闭包:

function f1(){
  n=999;
  function f2(){
    alert(n);
  }
  return f2;
}
var result=f1();
result(); // 999

很抽象对吧,那就用比较直白比较容易的话来描述下:

闭包就是能够读取其他函数内部变量的函数。

由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成定义在一个函数内部的函数

闭包就是将函数内部和函数外部连接起来的一座桥梁。

闭包的作用

一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。

function a() { 
 var i = 0; 
 function b() { alert(++i); } 
 return b;
}
var c = a();
c();

这里的a()执行完并返回后,没有被垃圾回收,因为a()里面的b()函数需要a()中的变量。

先写到这里吧。学到啥再补充。

最后修改于:2017年9月26日 上午11:47

喜欢 0
TAGS:  
本站文章除注明转载/出处外,均为本站原创或翻译。若要转载但请务必注明出处,尊重他人劳动成果。 转载请注明出处链接 : javascript笔记-对闭包的小小理解

2 条评论

  1. yukun 说道: 来自 Google Chrome 61.0.3163.79 in Windows 7
    2017-09-26 10:33

    闭包可以封装一个私有变量。

    还有开头说的有问题,在函数内部var定义的是局部变量,外部var定义的是全局变量。 :surprised:

    • huzikai0424 博主 说道: 来自 Google Chrome 55.0.2883.87 in Windows 8.1
      2017-09-26 11:48

      @yukun 多谢大佬提醒,文章已做修改。 :redface: