锁定老帖子 主题:JS 闭包
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-03-15
最后修改:2009-03-15
function outerFun() { var a=0; function innerFun() { a++; alert(a); } } innerFun() 上面的代码是错错误的.innerFun()的作用域在outerFun()内部,所在outerFun()外部调用它是错误的.
改成如下,也就是闭包: function outerFun() { var a=0; function innerFun() { a++; alert(a); } return innerFun; //注意这里 } var obj=outerFun(); obj(); //结果为1 obj(); //结果为2 var obj2=outerFun(); obj2(); //结果为1 obj2(); //结果为2
什么是闭包: 当内部函数 在定义它的作用域 的外部 被引用时,就创建了该内部函数的闭包 ,如果内部函数引用了位于外部函数的变量,当外部函数调用完毕后,这些变量在内存不会被 释放,因为闭包需要它们.
--------------------------------------------------------------------------------------------------------
再来看一个例子 function outerFun() { var a =0; alert(a); } var a=4; outerFun(); alert(a); 结果是 0,4 . 因为在函数内部使用了var关键字 维护a的作用域在outFun()内部.
再看下面的代码: function outerFun() { //没有var a =0; alert(a); } var a=4; outerFun(); alert(a); 结果为 0,0 真是奇怪,为什么呢?
作用域链是描述一种路径的术语,沿着该路径可以确定变量的值 .当执行a=0时,因为没有使用var关键字,因此赋值操作会沿着作用域链到var a=4; 并改变其值.
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-03-16
最后一个例子还是不太明白,var声明不是被提前了么?
|
|
返回顶楼 | |
发表时间:2009-03-16
作用域链是描述一种路径的术语,沿着该路径可以确定变量的值 .当执行a=0时,因为没有使用var关键字,因此赋值操作会沿着作用域链到var a=4; 并改变其值.
能不能具体清楚地解释一下,这个作用域链的具体链接,各个节点都是什么? |
|
返回顶楼 | |
发表时间:2009-03-16
Army 写道 最后一个例子还是不太明白,var声明不是被提前了么?
稍微修改一下最后一个例子的代码你就明白了: function outerFun() { alert(a); // got 4 a =0; alert(a); // got 0 } var a=4; outerFun(); alert(a); |
|
返回顶楼 | |
发表时间:2009-03-17
Army 写道 最后一个例子还是不太明白,var声明不是被提前了么?
需要理解一下 JS 的执行... 很多人认为JS是逐行执行的,这个观点是不对的. JS是逐块执行的... |
|
返回顶楼 | |
发表时间:2009-03-17
cocococoon 写道 Army 写道 最后一个例子还是不太明白,var声明不是被提前了么?
稍微修改一下最后一个例子的代码你就明白了: function outerFun() { alert(a); // got 4 a =0; alert(a); // got 0 } var a=4; outerFun(); alert(a); a就声明了一次而已。 这个啥也不能说明 |
|
返回顶楼 | |
发表时间:2009-03-17
kimmking 写道 cocococoon 写道 Army 写道 最后一个例子还是不太明白,var声明不是被提前了么?
稍微修改一下最后一个例子的代码你就明白了: function outerFun() { alert(a); // got 4 a =0; alert(a); // got 0 } var a=4; outerFun(); alert(a); a就声明了一次而已。 这个啥也不能说明 你如果把函数function看成一个内部类就比较容易理解了 |
|
返回顶楼 | |
发表时间:2009-03-18
从最后的例子看
outerFun可以引入外部的变量,而函数块内部的变量如果与外部同名而且用var重定义了,说明是函数的内部变量,否则引入的则是outerFun所在作用预的同名变量. |
|
返回顶楼 | |
发表时间:2009-03-19
elf8848 写道
function outerFun() { var a=0; function innerFun() { a++; alert(a); } } innerFun() 上面的代码是错错误的.innerFun()的作用域在outerFun()内部,所在outerFun()外部调用它是错误的.
innerFun()前面加个outerFun();看看。 |
|
返回顶楼 | |
发表时间:2009-03-20
没有用var 声明的局部变量,都视为全局变量
function test(){ i = 10;//全局变量 } var i = 0; test(); alert(i);//out: 10 上面这个函数就是闭包了。 |
|
返回顶楼 | |