**
闭包啊闭包
**
闭包是面试时常常会被问到滴!
闭包,是javascript比较重要的一个概念,对初学者是一个特别抽象的概念,特别是ECMAScript规范给的定义,如果没有实战过,很难理解.
**
闭包demo
**
闭包其实无处不在,比如:jQuery,zepto的核心代码都包含在一个大的闭包之中,一个最简单最原始的闭包demo:
function a(){
function b(){
console.log("Hellow 大哥");
}
return b;
}
var c = a();
c();//Hellow 大哥
这是最简单的闭包了.
和普通的函数有什么不同,剖析一下:
- 定义普通函数a
- 在a中定义普通函数b
- 在a中返回b
- 执行a,并把a的返回结果赋值给变量c
- 执行c
五步总结成一句话就是:
函数a的内部函数b被函数a外的一个变量c引用.
再加工一下就变成了闭包的定义:
当一个内部函数被其外部函数之外的变量引用时,就形成了一个闭包
执行上面五步就已经定义了一个闭包,这就是闭包
闭包的应用
当我们需要在模块中定义一些变量,并希望这些变量一直保存在内存中但是又不会"污染"全局的变量时,就可以用闭包来定义这个模块.
1.函数作为返回值
function F1(){
var a = 100;
return function(){
console.log(a)
}
}
var f1 = F1();
var a = 200;
f1();//100
2.函数作为参数传递
function F1(){
var a = 100;
return function(){
console.log(a)
}
}
var f1 =F1();
function F2(fn){
var a = 200;
fn();
}
F2(f1)//调用会打印出100,而不是200
闭包的用途
- 读取其他函数内部的变量
- 让变量的值始终保存在内存中
javascript中闭包的应用都有关键词return,引用javascript秘密花园中的一段话就是因为:
闭包是javascript一个非常重要的特性,这意味着当前作用域总是能够访问外部作用域中的变量.因为函数式javascript中唯一拥有自身作用域的结构,因此闭包的创建依赖于函数
来段代码:
function f1(){
var n = 0;
function f2(){
n++;
console.log(n);
}
return f2;
}
var temp = f1();
temp();//1
temp();//2
在以上代码中,f2被定义在f1函数的内部,所以f1定义的局部变量n,f2是可以访问到的,但是如果在f2中定义的变量,f1是访问不到的.