闭包:闭包的应用直接上代码理解:
function doSth(t,cb){
return function(){
if(--t === 0){
cb()
}
}
}
function logSth(){
console.log('嘿嘿嘿');
}
let fn=doSth(4,logSth);
fn()
fn();
fn();
fn();
每一次的结果其实都不一样;
总结一下:
闭包其实就相当于,一个外层函数,一个内层函数,内层函数依赖外层函数中的属性或者方法.外层函数将这个内层函数作为返回值return;也可以直接不声明变量,直接去接受一个匿名函数.这样都可以形成闭包:下面给出解释
闭包类型①
//在全局声明一个变量
function doSth(){
num=999
index='好小子',
like='你居然学会了闭包?'
//返回一个匿名函数
return function(){
console.log(index,num++,like)
}
}
这样就形成了闭包的一种类型
闭包类型②
function doSth(){
num=999
index='好小子',
like='你居然学会了闭包?'
bibao=function (){
console.log(num,index,like)
}
}
//这里需要注意,第②种类型的闭包里面的bibao前面不能够加声明关键词,比如var let const,加了这个函数就只是doSth里面的一个函数了
上面两种类型的闭包
第一种类型的闭包需要先执行一次最外层的函数,然后将返回值赋值给一个变量,这个变量可以是全局里面的变量,也可以是别的函数内部的变量.如果作为在别的函数内部变量,就需要你这个最外层函数是一个全局函数,这个最外层函数不会和别的函数形成闭包.
返回上面这一样说的两种变量:
①全局变量:如果是赋值给了一个全局变量,那么其实就相当于你在全局声明了一个对象了.所有人都可以通过调用这个变量的执行结果去获取到里面的属性值,就好像一个全局对象你去.出来里面的属性值一样
②局部变量:如果是赋值给了一个局部变量,那么起始就相当于你在这个局部变量里面声明了一个对象.这个局部变量所在的作用域里面的所有人都可以来访问到这个里面的属性值了.就相当于你在局部定义了一个对象,然后.出来这个对象里面的属性值一样
第二种类型的闭包:不需要执行外层的那么函数,因为赋值的变量直接就是属于window的,也就是相当于上面说的直接在全局里面声明了一个 对象,想要是用里面的属性值直接点就行,这里就是直接执行这个变量就行
标签:闭包,function,外层,里面,函数,js,详解,变量 From: https://www.cnblogs.com/yourgrandfather/p/17111102.html