求助关于闭包和提升

hhxx
  • 569

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.2k
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
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏