JS闭包
作用域
- js只有函数作用域没有块作用域
- js函数内部可以直接读取全局变量
- 内部函数可以访问外部函数的变量,外部函数无法访问内部函数的局部作用域
var a = 100;
function fn(){
console.log(a)// 100
}
function fn2(){
var b = 200;
function fn3(){
console.log(b)// 200
}
}
function fn3() {
var c = 300;
}
console.log(c)// undefined
问题
- 如何在函数外部读取函数内部的局部作用域
function fn4() {
var d = 400;
return function() {
console.log(d)
}
}
var temp = fn4();
temp();// 400
闭包定义
- 闭包就是能够读取其它函数内部变量的函数
- 由于js中只有函数内部的子函数才能读取局部变量,所以闭包可以认为是‘定义在一个函数内部的函数’
闭包的作用
- 读取函数内部的变量
- 让这些局部变量始终保存在内存中
var gtemp = null;
function fn5(){
var n = 1;
gtemp = function(){
n += 1;
}
return function(){
console.log(n)
}
}
var temp = fn5();
temp();// 2
gtemp();
temp();// 3
注意:第一次调用temp自加1
调用gtemp()方法自加1
在次调用temp方法时n并没有在fn5调用完释放,而是继续自加1
fn5内部匿名函数赋值给全局变量,匿名函数无法释放,因为匿名函数的存在依赖于fn5函数,所以fn5也始终在内存中不会在调用完后被gc
var gv = 'the window'
var objects = {
gv: 'the name',
objFun: function(){
return function(){
return this.gv;
}
}
}
console.log(objects.objFun())// the window
var gv = 'the window'
var objects = {
gv: 'the name',
objFun: function(){
var self = this;
return function(){
return self.gv;
}
}
}
console.log(objects.objFun())// the name
闭包的概念
当内部函数 在定义它的作用域(js中只有函数作用域)的外部被引用时,就创建了该内部函数的闭包 ,如果内部函数引用了位于外部函数的变量,当外部函数调用完毕后,这些变量在内存不会被释放,因为闭包需要它们.
发恳写代码