作用域
js的作用域主要分为:全局作用域和局部作用域
作用域链
作用域链是保证对执行环境有权访问的所有变量和函数的有序访问,
函数作用域(局部作用域)中访问变量是通过,访问函数作用域内部变量,访问父级作用域变量,访问全局作用域变量的顺序访问,
这就导致外层父级作用域无法访问子级作用域的变量;
闭包定义:
函数嵌套时内层函数引用了外层函数作用域下的变量,并且外层函数在全局环境下可访问,就形成了闭包
闭包原理,函数内部的子函数才能读取局部变量
在正常情况下外界时无法访问函数内部的变量的,函数执行完后,上下文即被销毁。
但是在外层函数中,若我们返回了另一个函数,且这个返回函数使用了外层函数的变量,外界因而便能够通过这个返回的函数获取原外层函数内部的变量;
闭包问题
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。