在JS中,不存在其他语言中的大括号级的作用域,但它有函数作用域,若想访问函数内部的局部变量,可以在函数内部声明一个函数,用来返回函数内部的局部变量。
如下例:
var a=5;; function f1() { var a=1; function f2() { alert(a); } return f2(); } a; =>5 f1(); =>1
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
可有以下几种闭包:
闭包#1:
function f() { var b = 'b'; return function () { return b; } } var n = f(); n(); =>'b'
闭包#2:
var n; function f() { var b = 'b'; n = function () { return b; } } n(); =>'b'
闭包#3:
function f(arg) { var n = function () { return arg; } arg++; return n; } var m = f(123); m(); =>124
闭包#3中n被赋值时函数并没有被调用,调用是在n被求值,也就是执行return n;语句时被调用的。