论坛首页 入门技术论坛

JS 闭包

浏览 26073 次
锁定老帖子 主题:JS 闭包
该帖已经被评为新手帖
作者 正文
   发表时间:2009-09-01  
Jamson 写道

<script>
function outerFun()  
{  
    var b=0;  
    function innerFun()  
    {  
        a=1;  
        alert(a);  
    }  
    return innerFun;  //注意这里  
}  
var obj=outerFun();  
obj();  //结果为1  
obj();  //结果为2  
alert(outerFun.b);  //结果为undefined
alert(obj.b);     //结果为undefined
</script>

有人能为我解释一下:最后两个为什么是undefined嘛?


Jamson 写道

obj();  //结果为1  
obj();  //结果为2


结果都应为1

Jamson 写道
<
alert(outerFun.b);  //结果为undefined
alert(obj.b);     //结果为undefined


因为outerFun是函数,obj是对函数的引用,b是函数内部的局部变量
不能像对象引用属性那样来引用它,也不可能
因而outerFun.b与obj.b都是undefined的
0 请登录后投票
   发表时间:2009-09-12  
cocococoon 写道
Army 写道
最后一个例子还是不太明白,var声明不是被提前了么?


稍微修改一下最后一个例子的代码你就明白了:
function outerFun()  
{  
     alert(a);     // got 4
     a =0;  
     alert(a);     // got 0    
 }  
 var a=4;  
outerFun();  
alert(a);  



还用一个例子你可能就更能理解了
function outerFun()  
{  
     alert(a);     // got 4
     a =0;  
     alert(a);     // got 0    
 }
outerFun();  //函数位于var定义变量之前
var a=4;  
alert(a);  

这样的话就会报错,因为执行函数时,才会根据作用域需找定义的变量,此时的变量a还未定义
0 请登录后投票
   发表时间:2009-09-17  
hanjs 写道
从最后的例子看

outerFun可以引入外部的变量,而函数块内部的变量如果与外部同名而且用var重定义了,说明是函数的内部变量,否则引入的则是outerFun所在作用预的同名变量.

这样的话我就明白了
0 请登录后投票
   发表时间:2009-09-18  
闭包的这个还是第一次听说,长见识了。
作用域那个早就知道,还是自己试出来的,现在每用一个变量我都要var 定义,要不就会改变其它的值了。(for循环里的i最为明显,不明白的人可以写一个循环,在循环里调用另一个方法,在这个方法也也使用循环,循环变量都用i,你就会见到一个神奇的结果)
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics