一 闭包
1 定义:有权访问另一个函数作用域中的变量的函数
缺点:闭包比其它函数占用更多内存,不要过多的使用
2 闭包有哪些
(1) 通过作用域链在全局环境中查找变量x,fn1()就是闭包
var x = 1
function fn1(){
laert(1)
}
fn1()
(2)嵌套在fn1中的fn2就是闭包
-------即访问上层函数的作用域中的内层函数就是闭包
function fn1(){
var x = 1
function fn2(){
alert(x)
}
fn2()
}
(3)fn2 在 fn1 函数的作用域中声明,在全局作用域中被调用 fn2就是闭包
-------指在函数声明的作用域以外的地方被调用的函数,需要通过将该函数作为返回值或参数传递,叫闭包
function fn1(){
var x =1
function fn2(){
alert(x)
}
return fn2
}
fn1()()
function fn1(){
var x = 1
function fn2(){
alert(x)
}
fn3(fn2)
}
function fn3(n){
n()
}
fn1()
3 闭包的特性
(1) 自闭
------
var x = 1
function fn1(){
laert(x)
var x = 2
}
fn1()
alert(x)
(2) 包裹特性
[1] 普通函数调用完毕后系统会自动注销函数,释放资源
[2] 闭包结构 当外部函数被调用后 闭包函数依然被保存在系统中 从而实现包裹数据的目的
function fn1(a){
var x = a
var y = function fn2(){
return x
}
return y
}
var c = fn1(1)
laert(c) // fn2
m = c()
alert(m)
alert(m) // 1
4 闭包应用
(1) 使用闭包能够跟踪动态环境中,数据的实时变化
function fn1(){
var a = 1
var b = function fn2(){
return a
}
a++
return b
}
var c = fn1()()
alert(c) // 2
(2)闭包不会因为外部环境的注销而消失
----当 fn1 执行完毕,并没有被销毁,因为闭包引用了变量 a ,所以继续存在
function fn1 (){
var a = 1
b = function(){alert(a)}
c = function(){alert(a++)}
e = function(){alert(a)}
d = function(x){alert(a = x)}
b()
c()
e()
d(5)
}
fn1()
5 闭包的底层原理
作用域链:1 当某个函数被调用时,会创建一个执行环境和相应的作用域链,同时初始化函数的活动对象
2 在作用域链中,该函数处于作用域链第一层,该函数的外部函数作用域处于第二位,外部的外部处于第三层...直到作用域的终点为全局作用域
3 作用域链的查找是自下到上
function fn1(){
if( a<b ){
return -1
}else{
return 1
}
}
function fn1 (arg){
return function(a,b){
var v1 = a[arg1]
var v2 = b[arg1]
if(v1<v2){
return -1
}else{
return 1
}
}
}
fn2 = fn1("zs")
fn2 ({"age":23},{"age":24})
6 闭包重点
function fn1(){
var a = []
for(var i = 0; i<3;i++){
a[i] = function(){
return i
}
return a
}
}
var b = fn1()
alert(b)