也来谈谈JavaScript中的闭包

相信很多人在学习JavaScript的时候,都会碰到这么一句话:

因为作用域链的存在,JavaScript的函数就是一个闭包


作用域如果不了解的话,可以看我的另外一篇也来谈谈JavaScript的作用域链


很多人看完这句话后,从此记住了,JavaScript函数是一个闭包,然后哪天有人问他,为什么JavaScript函数是个闭包呢?

答因为有作用域链啊,为什么有作用域链就是闭包呢?对哦,为什么呢?还有,什么是闭包呢?好像不是很清楚,总之我就记住了它是闭包。


这里我就来讲讲,什么是闭包,先看闭包在JavaScript中的解释:

Since scope-defining construction in Javascript is a function, not a code block like 
in many other languages, what we usually mean by closure in Javascript is a fuction 
working with nonlocal variables defined in alreadyexecuted surrounding function.

简单翻译下:

在JavaScript中,使用函数来定义和构造作用域,而非其他语言的代码块,所以我们通常所说的闭包指得是,一个函数运行时使用了在其外部函数(已经执行过的父函数)中定义的变量


所以,如果要是闭包,必须符合两个条件:

1:内部环境对外是不可见的,这个作用域也就是函数就符合

2:函数内部,一定要引用并使用了其外部函数已经定义过的变量


看代码:

function closuretest(){
  var h = 'dog';
  var c = 'cat';  
}

这个JS函数是闭包吗?明显不是,因为它没有引用外部变量


继续看:

function closuretest(){
  var h = 'dog';
  var c = 'cat';  


  var f = function(){
    h = 'animal';
    c = 'fish';
  }


  return f;
}

var thisisclosure = closuretest();
这里,thisisclosure是一个闭包,也就是说,closuretest内部的这个匿名函数是一个闭包,因为其内部引用了两个已经在其外部定义过的变量h和c


所以,不是因为JS函数支持作用域链,它就是闭包,而是JS函数的这种作用域链的特性,能使我们轻而易举的实现一个闭包。



发布了46 篇原创文章 · 获赞 25 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/zhejiang9/article/details/51887146