javascript - 求助关于闭包和提升
怪我咯
怪我咯 2017-04-10 15:54:52
[JavaScript讨论组]

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

var result2=f1();

  result1(); // 999

result2();//999

  nAdd();
 result1(); // 是999而不是1000,这是为何呢?

result2();//1000
哪位大神可以解释下?还有如果以nAdd=function(){

     n+=1
    };这种形式在函数内定义了一个全局变量,这个全局变量也可以访问n吗?不是全局变量不能访问函数内的变量吗?还有我记得有书上面说的是函数的作用域不是是取决于函数定义的时候而不是调用的时候的作用域吗?这个全局变量nAdd不就是相当于定义的时候是全局吗?所以不应该不能访问n吗?这一块一直都不太懂,希望哪位大神可以教教我!谢谢

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(2)
阿神
  • 这种形式在函数内定义了一个全局变量,这个全局变量也可以访问n吗?

     `是`
    
  • 不是全局变量不能访问函数内的变量吗?还有我记得有书上面说的是函数的作用域不是是取决于函数定义的时候而不是调用的时候的作用域吗?

    `是`
    
  • 这个全局变量nAdd不就是相当于定义的时候是全局吗?

    `是`
    
  • 所以不应该不能访问n吗?
    不是,因为nAdd在声明时虽然被定义成全局变量,但它仍然是定义在f1内部的函数,在作用域链中,nAdd依旧可以访问到n。然而,又因为nAdd是全局变量,所以当调用result2 = f1()时,nAdd的定义把前一次result1 = f1()调用时定义的nAdd给覆盖了,这表示现在nAdd里拿到的n其实是后一次调用result2 = f1()时声明的局部变量n。这就是为什么再次分别调用result1() 会是999,而result2()会是1000的原因了

黄舟

函数中变量的作用域是在定义的决定,而不是在在执行的时候。
也就是

nAdd=function(){
 n+=1
};

这个赋值语句执行完毕后,变量n就是函数f1中的变量n,虽然nAdd是一个全局变量

var n=0;
function f1(){
    var n=999;
    nAdd=function(){
     n+=1;
     return n;
    };
    function f2(){
      alert(n);
    }
    return f2;
  }
f1();
nAdd();//返回值还是,而不是0
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

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