闭包
1、JS中函数是一等公民
1.1在JavaScript中,函数是非常重要的,并且是一等公民;
函数可以作为另外一个函数的参数,也可以作为另外一个函数的返回值来使用;
1.2高阶函数: 当一个函数如果接收另外一个函数作为参数,或者该函数会返回另外一个函数作为返回值时, 那么这个函数就称之为是一个高阶函数。
1.3函数和方法的区别:
函数function: 独立的function, 那么称之为是一个函数
function foo() {}
方法method: 当我们的一个函数属于某一个对象时, 我们称这个函数是这个对象的方法
var obj = {
foo: function() {}
}
obj.foo()
2、JS中的闭包
2.1定义
①从广义的角度来说:JavaScript中的函数都是闭包;
②从严格角度上(狭义的角度):闭包由两部分组成:函数本身+这个函数可以访问的自由变量
③自由变量:在自身函数里面可以访问的上层作用域里的某些变量
总结: 一个普通的函数function,如果它可以访问外层作用域的自由变量,那么这个函数就是一个闭包;
2.2闭包的执行过程
function foo() {
var name = "foo"
var age = 18
function bar() {
console.log(name)
console.log(age)
}
return bar
}
var fn = foo()
fn()
上述代码执行过程图(内存图):
2.3闭包的内存泄露
闭包会造成内存泄露,其实就是在引用链中的所有对象都是无法释放的
JS引擎(V8引擎对内存的优化):AO对象(动态对象(Activation Object(AO)))不会被销毁时,但闭包里面未使用到的属性会被释放)