例如: javascript
var n = 9999; function f1(){ alert(n); } f1();//9999
另一方面,在函数外部天然没法读取函数内部的局部变量。 java
function f1(){ var n = 99; } alert(n); //错误这里有一个地方须要注意,函数内部声明变量的时候,必定要使用var命令。若是不用的话,你实际上声明了一个全局变量。
function f1(){ n =99; } f1(); alert(n); //99二.如何从外部读取局部变量
fucntion f1(){ var n =99; function f2(){ alert(n); //99 } }在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的全部局部变量,对f2都是可见的。可是反过来就不行,f2的局部变量对f1就是不见的。这就是js语言特有的链式做用域结构,子对象会一级一级地向上寻找全部父对象的变量。因此,父对象的全部变量,对子对象都是可见的,反之不成立。
function f1(){ var n=99; function f2(){ alert(n); } return f2; } var result = f1(); result(); //99三.闭包的概念
function f1(){ var n =99; nAdd = function(){n+=1;}; function f2(){ alert(n); } return f2; } var result = f1(); result(); nAdd(); result();在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是99,第二次的值是1000,这证实了,函数f1中的局部变量一直保存在内存中,并无在f1调用后被自动清除。
2.闭包会在父函数外部,改变父函数内部变量的值,因此,若是你把父函数看成对象使用,把闭包看成它的公用方法,把内部变量看成它的私有属性,这时必定要当心,不要随便改变父函数内部变量的值。 闭包
总结:
闭包就是至关于java中一个类A中声明另外一个类B,把类B当成类A的成员变量使用,而类B中的函数至关于类A的方法,类B中的属性就是私有的,类A要用类B的属性,就得声明类B。 函数
1 一个函数是一个做用域。一个{}不是做用域。
2 为了防止低层的子函数查找很是高层的父函数中变量,一般把高层做用域中的变量的一个引用,存放在子函数内部维护,提升效率。 性能