JavaScript闭包
1、JS变量的作用域
1、函数变量的作用域有全局变量和局部变量两种,全局变量写在函数的最前面,局部变量写在函数体内,局部变量省略了var 也就默认成为了全局变量!
2、函数体内部可以读取到函数外的变量,而函数外不能读取到函数内的变量!
在理解了函数变量的作用域之后,也需要理解函数的作用域链了:
1、每一个函数都有一个与之相关的作用域链,当js在查找变量X时,它会从链的第一个对象开始查找,如果这个对象有一个名为X的属性值,则会直接使用这个
属性值,如果没有就继续下一个对象寻找...一直找到最后都没有的话则会输出ReferenceError引用错误!
2、作用域链查找的顺序是:当前函数对象-->上一层函数对象...-->window全局对象!
2、从外部读取方法内部的局部变量
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <script type="text/javascript"> function func(){ var a=22; function func2(){ return a; } return func2; } var result=func(); alert("访问func的私有局部变量a:"+result()); </script> </body> </html>
3、闭包的概念
各种专业的文献上对“闭包”的解释感觉都非常的抽象,不太容易看懂。我对闭包的理解就是:闭包就是能够读取其他函数内部变量的函数。
在JavaScript语言中,只有函数内部的子函数才能够读取函数变量,因此可以把闭包简单理解为“定义在一个函数内部的函数”。所以从本质上讲,闭包就是将函数内部和函数外部连接起来的一个桥梁。
4、闭包的用途
1、可以读取函数内部的局部变量
2、可以让这些变量的值始终保存在内存里边。
5、闭包的使用注意点
1、由于闭包会使得函数中的变量都被保存在内存中,内存消耗变大,所以要慎重使用闭包,否则会造成网页的性能问题严重的时候还会导致内存泄漏;关于这个问题的解决办法就是在退出函数之前将不使用的局部变量全部删除!
2、闭包会在父函数的外部改变父函数里边的内部变量的值,所以当把父函数当作对象使用的话,把闭包当作一个公共方法,把内部变量当作私有属性时一定要小心不要随意改变父函数内部变量的值。