慕尔如星,愿守一人心,从天光乍破,走到暮雪白头。
变量的作用域
- 变量的作用域两种:全局变量和局部变量。
- 局部变量
定义在函数内部的变量就是局部变量,只能在其被声明的函数内部被访问。这样的变量只在函数运行时存在,一旦退出函数,这些局部变量就都被销毁。所有在函数内部声明的变量名称都将被加入作用域中。
函数内部可以直接读取全局变量。
- 全局变量
- 全局变量是在函数外定义的,可以在整个程序范围内访问,但是必须在所要访问的函数中使用关键词 global 声明函数外的变量为全局变量,这样访问的才是在函数外定义的全局变量。
1 | var n=999; |
- 在函数外部无法读取函数内的局部变量。
1 | function f1(){ |
- 函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量。
1 | function f1(){ |
闭包
- 函数可以访问函数作用域链中的变量,但如果我们想在函数外访问函数内却不行,闭包就是将函数内部和函数外部连接起来的一座桥梁。
1 | function myfunction() { |
- 函数可以访问函数作用域链中的变量。
1 | function myfunction() { |
- 在函数外面成功访问到了 num 变量。
- 这创建了一个闭包。闭包就是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。
闭包使用注意
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。