标签:block 作用 嵌套 lock 使用 闭包 ++ function 内存
如何产生闭包?
当一个嵌套的内部(子)函数引用了嵌套外部(父)函数的变量(函数)时,就产生了闭包
注意: 闭包存在于嵌套的内部函数中
产生闭包的条件?
- 函数嵌套
- 内部函数引用了外部函数的数据(变量或者函数)
作用:
- 使函数内部的变量在函数执行完后,仍然存活在内存中(延长了局部变量的生命周期)
- 函数的生命周期:当函数执行完后,自动释放内部的变量
- 让函数外部可以操作函数内部的数据(变量、函数)
//延长了生命周期和操作局部函数的内部变量
function fn1() {
var a = 1
function fn2() {
a++
console.log(a)
}
return fn2
}
var f = fn1()
f() //2
f() //3
缺点:
- 函数执行完后,函数内的局部变量没有释放,占用内存时间会变长 (解决: f = null)
- 容易造成内存泄漏
内存溢出和内存泄漏
内存溢出:
- 一种程序运行出现的错误
- 当程序运行需要的内存超过剩余的内存时,就会抛出内存溢出的错误
内存泄漏:
- 占用的内存没有及时释放
- 内存泄漏积累过多,就会造成内存溢出
- 常见的内存泄漏:
- 意外的全局变量
- 没有及时请理的及时器或者回调函数
- 闭包
代码理解
var name = ‘The window‘
var obj = {
name: ‘The object‘,
getName: function() {
return function(){
return this.name
}
}
}
console.log(obj.getName()()); //The window
/*
分析:
obj.getName(): function() { return this.name} 使 a = obj.getName()
a(): this.name 这里就是全局调用,this指向window
并且这里可以看出没有使用闭包
*/
var name = ‘The window‘
var obj = {
name: ‘The object‘,
getName: function() {
var that = this
return function(){
return that.name
}
}
}
console.log(obj.getName()()); //The Object
/*
分析:
obj.getName(): function() { return that.name} 使 a = obj.getName()
a(): that.name 这里就是全局调用,that指向obj中的this
使用闭包
*/
标签:block 作用 嵌套 lock 使用 闭包 ++ function 内存
原文地址:https://www.cnblogs.com/xyf724/p/13353927.html