闭包
什么是闭包
闭包可以让你的内部函数去访问外部函数的作用域
首先我们先讲讲作用域
作用域
实例:
function greet(){
var name = "nate" ;
function sayHello(){
console.log("hello,"+name);
}
sayHello();
}
如果我们开始执行greet()这个函数,我们发现sayHello()这个函数内的name是没有被定义的,而函数执行后,sayHello()从他的父函数那里拿到了name的值。
嵌套函数可访问声明于它们外部作用域的变量。
闭包
实例:
function Add(x){
return function (y){
return x+y;
}
}
var Add3 = Add(3);
var Add5 = Add(5);
console.log(Add3(10)); // 13
console.log(Add5(10)); // 15
Add3 和 Add5 都是闭包。它们共享相同的函数定义,但是保存了不同的词法环境。在 Add3 的环境中,x 为 3。而在 Add5 中,x 则为 5。
- 闭包是由函数以及声明该函数的词法环境组合而成的。该环境包含了这个闭包创建时作用域内的任何局部变量。
考虑闭包的中函数变量的生命周期:
我们看下面这个例子:
function greet(){
var name = "nate" ;
function sayHello(){
console.log("hello,"+name);
}
return sayHello();
}
var myFunc = greet();
myFunc();
在这个greet()函数中 ,最后有个return sayHello(),在一般的函数中,例如c里头,当函数执行完并返回(return)值后,该函数中的变量将会返回初值,而这里的myFunc()在使用时,依旧可以使用到函数中的变量 name ;