一个javascript问题。
阿神
阿神 2017-04-11 11:13:54
[JavaScript讨论组]
function f1(){
    var n=999;
    nAdd=function(){
        n+=1
    }
    function f2(){
        alert(n);
    }
    return f2;
}

var result1=f1();
var result2=f1();
result1(); // 999
nAdd();
result1(); // 999
result2(); //1000


为什么输出分别是999,999,1000而不是999,1000,1000
阿神
阿神

闭关修行中......

全部回复(4)
ringa_lee

因为n不是全局变量,每次调用f1()都会创建独立的n

那么显然,第二次调用var result2=f1();之后,nAdd里的n就只对result2负责了,于是result1()仍然打印出来的是她自己作用域里的那个999

ringa_lee

两点很关键: n是局部变量,nAdd是全局变量!此时,上面的代码应该可以写成这样:

var nAdd;
function f1(){
    var n=999;
    nAdd=function(){
        n+=1
    }
    function f2(){
        alert(n);
    }
    return f2;
}

var result1=f1();
var result2=f1();
result1(); // 999
nAdd();
result1(); // 999
result2()
  1. 这就是一个闭包,在创建result1的时候,n是999,并且独立属于result1的闭包里面,并且第一次给nAdd赋值了,这时候,nAdd里面N 指向result1闭包里面的n。

  2. 紧接着, 创建了result2,此时,由于n是局部变量,会创建新的n,于是,nAdd被再次赋值,并且,此时nAdd里面的n指向的是result2里面的n了。

  3. 所以,运行nAdd改变的仅仅是result2闭包里面的n值!

希望有所帮助!

天蓬老师

第二次运行 f1() 的时候,覆盖了 nAdd 的定义,所以 nAdd 是在第二次运行的 f1() 中定义的,所以会改变 result2 的输出。

伊谢尔伦

好好的闭包居然弄了个全局,无法理解这样的运用。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号