相信很多人在学习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函数的这种作用域链的特性,能使我们轻而易举的实现一个闭包。