什么是作用域?
作用域就是作用范围,是指某个环境中某个数据的作用范围。子环境可以使用父环境中的变量,因为父环境中的变量的作用域是整个父环境,当然包括父环境中的子环境。
函数体内定义的变量的作用域是整个函数体
块级作用域的理解:
函数的花括号{}包裹的是函数体,拥有函数作用域;非函数的花括号{}会形成一个块,在这个块中,var没有块级作用域,let和const有块级作用域。for循环时,let和var定义的变量是在块里面的
什么是环境?
window下的变量有全局环境,函数调用后会在内存中开辟一块函数环境(内存空间),同一个函数经过多次调用会产生多块函数环境,且相互之间没有关系
什么是闭包?
闭包是一个现象,js中有个垃圾清理机制,找到内存中那些不再使用的变量,并将其释放掉。当父环境中的某个变量被子环境使用时,整个父环境的其他变量也会被保留(全局环境的变量不会被回收)。当我们利用子函数能够访问父函数中的变量来解决问题时,就形成了闭包。
理解父函数中的变量被子函数使用:
1、子函数中变量被当做判断条件使用
2、子函数使用了父函数的变量,并被父函数return到外部被外部变量接住,在调用外部这个变量时,就使用了原父函数中的变量了(父环境想要访问子环境的变量可以用这种方式实现)。
闭包导致的内存泄露的解决方案:
让被使用的变量被使用完后,在合适的时机赋值为null