您的位置:首页 > Web前端 > JavaScript

JS难点剖析(二)闭包

2016-04-14 00:00 162 查看
摘要: JavaScript 难点 闭包

JS难点剖析(二)闭包
一.关于变量作用域

相信不管你接触什么编程语言,应该都是会了解变量作用域的概念。C中有全局变量和局部变量的概念,Java中是成员变量、局部变量、类变量(静态变量)。其实就是变量的作用域不同。JS中也是如此,分为全局变量和局部变量。

注:

var num1 = 100;

function fun(){

var num1 = 200;

return num1;

}

console.info(num1);//100

fun();

console.info(num1);//100

这里这样写没问题但是如果是下面这样呢:

var num1 = 100;

function fun(){
num1 = 200;

return num1;

}

console.info(num1);//100

fun();

console.info(num1);//200
区别就在于fun()方法中的num1定义的时候没有加var关键字,所以在调用fun()的时候返回变量num1是全局变量,把原来的全局变量num1的值改变了。
所以:定义变量时应该使用var关键字更为安全,避免全局变量的滥用导致出现不可预知的后果。
二.JS闭包作用以及实例解析

<script type="text/javascript">

var globalVar = 'this is globalVar';

function fun(){

var localVar = 'this is localVar';

}

console.info(globalVar)//this is globalVar

console.info(localVar)//ReferenceError: localVar is not defined

</script>

可以发现,你无法在方法外部去访问一个局部变量,但是:闭包将帮你完美解决这个问题。

function fun1(){
     n=100;
     function fun2(){
       alert(n); // 100
     }
   }
在上面的代码中,包括函数fun2就被在函数fun1内部,这时fun1内部的所有局部变量,对fun2都是可见的。但是反过来就不行,fun2内部的局部变量,对fun1 就是不可见的。这就是Javascript语言特有的“链式作用域”结构(chain scope)。子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。既然fun2可以读取fun1中的局部变量,那么只要把fun2作为返回值,我们不就可以在fun1外部读取它的内部变量了吗!
其实:闭包就是一个函数用来够读取其他函数内部变量。
<script type="text/javascript">

 function fun1(){

var n = 100;

function fun2(){

alert(n)

}

return fun2;

}

var obj = fun1()

obj()//100

</script>

在这里可以看到,fun2()函数就是一个闭包。

三.总结

1.不要滥用闭包,会导致内存的泄露(闭包会使变量都存储在内存中所以内存的消耗是很严重的!)

2.你可以把闭包当成父对象的公用方法(还记得setter和getter吗?在这里可以理解为getter方法),通过闭包函数来访问其内部变量,如果是私有的变量就声明为私有的,不可以混用。

3.闭包还有很多复杂的用法以及一些特性,欢迎讨论拍砖,共同进步。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: