1. 变量作用域 变量的作用域有两种:全局变量和局部变量。JS语言定义了:函数内部可以直接读取全局变量,但是函数外部无法读取函数内部的局部变量。注意点:大家都知道,变量是需要用var关键字声明的。但是javascript中也可以隐式的使用变量,就是不用声明,直接使用。而且,千万注意,javascript把隐式声明的变量总是当成全局变量来使用的。
没有var,let声明的变量或者在函数外部声明的变量都是全局变量;使用 var 声明的变量属于所在函数,不管在函数的哪个位置出现,等价于在函数一开始声明。该变量为局部变量,局部变量比同名全局变量的优先级高。
2. 如何从外部读到函数内部的局部变量?某些情况下,需要从外部获取函数内部的局部变量,但是上面已经提到,正常情况下,是不允许访问的,需要通过一定的方法才能实现
那就是,在函数内部,在定义一个函数function goPlat(){ var t=888;//局部变量 function showNumber(){ console.log(t); } return showNumber } this.result=goPlat(); this.result();//888
在上面的代码中,函数goPlat内部的变量对函数showNumber都是可见的
反之,函数showNumber里面的变量对函数goPlat就是不可见的
这就是JS中的链式作用域结构,子对象会向上一级一级寻找父对象的变量
所以父对象的变量对于子对象来说都是可见的
所以,竟然函数showNumber可以读取函数goPlat里面的t,那么把函数showNumber作为返回值,不就可以在外部访问局部变量t了。
3. 闭包的概念在上面的代码中,函数showNumber就是一个闭包,闭包就是能够读取其他函数内部变量的函数。
由于在JS中,只有函数内部的子函数才能读取局部变量,所以闭包也可以理解为:定义在一个函数内部的函数。
所以本质上:闭包是连接函数内部和函数外部的桥梁。
4. 闭包的用途闭包最大的两个用途:使得外部能够访问函数内部的变量;第二个就是让这些变量的值始终保存在内存中,不会在goPlat()调用后被清除。
5. 使用闭包的注意点由于闭包会使得函数内部的变量保存在内存中,内存消耗很大,不能滥用闭包,否则会引起网页性能问题,在IE中导致内存泄漏,解决方法时:在退出函数之前,将不使用的局部变量删除。
闭包会在父函数外部改变父函数内部局部变量的值,所以如果你把父函数当做对象使用,把闭包当成公共的方法,把内部变量当成私有属性,这时一定要小心,不要随意改变父函数内部变量的值。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)