JavaScript闭包

一、定义

闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。

二、语法结构

闭包就是一个代码块,用“{ }”包起来,程序代码也就成了数据,可以被一个变量所引用,闭包的最典型的应用是实现回调函数。

{ 参数 ->
代码...
}

例:

定义了两个闭包c1和c2,并调用:
def c1 = { println it }
def c2 = { text -> println text }
c1.call("content1") //用call方法调用闭包
c2("content2") //直接调用闭包

注:“->;”之前的部分为闭包的参数,如果有多个参数,之间可用逗号分割;“->;”之后的部分为闭包内的程序代码。如果省略了“->;”和它之前的部分,此时闭包中代码,可以用名为“it”的变量访问参数。
代码举例:

function makeAdder(x) {
  return function(y) {
    return x + y;
  };
}
var add5 = makeAdder(5);
var add10 = makeAdder(10);

console.log(add5(2));  // 7
console.log(add10(2)); // 12
注:在这个例子中,定义了一个makeAdder(x)函数,一个参数x,返回一个新的函数,参数是y,并返回x+y
makeAdder 是一个函数工厂,它创建了将指定的值和它的参数相加求和的函数(makeAdder())。
上面的例子是说:我们使用函数工厂创建了两个新函数 ,一个将其参数和 5 求和,另一个和 10 求和。
add5 和 add10 都是闭包。它们共享相同的函数定义,但是保存了不同的词法环境。在 add5 的环境中,x 为 5。而在 add10 中,x 则为 10。

三、特点;

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

这段代码有两个特点:
1、函数b嵌套在函数a内部;
2、函数a返回函数b。
这样在执行完var c=a( )后,变量c实际上是指向了函数b,再执行c( )后就会弹出一个窗口显示i的值(第一次为1)。这段代码其实就创建了一个闭包,这是因为函数a外的变量c引用了函数a内的函数b。也就是说,当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。

闭包的优势

1.全局变量可能会造成命名冲突,使用闭包不用担心这个问题,因为它是私有化,加强了封装性,这样保护变量的安全,防止全局变量被污染。
2.每个模块都可以调用。

你可能感兴趣的:(JavaScript闭包)