变量对象中全局变量为何覆盖当前函数的局部变量?

function foo(a) {
  var b = 2;
  function c() {}
  var d = function() {};

  b = 3;

}

foo(1);

代码执行之后

AO = {
    arguments: {
        0: 1,
        length: 1
    },
    a: 1,
    b: 3,
    c: function c(){},
    d: reference to FunctionExpression "d"
}

请问为什么执行代码之后,b会变成3 b不是VO全局对象里面的吗?

阅读 2.6k
1 个回答
function foo(){
  var a = 1;
  a = 2;
}

你认为这个第二个a = 2是操作全局变量?

你只需要记住操作变量都是先从局部作用域找,局部作用域有这个变量则操作局部变量,局部没有继续向外找,然后一层层向外找直到全局
你这个函数里面已经声明了一个局部变量b,所有在本函数内对b的操作都是局部的

function foo(){
  a = 2;//不用var声明使a为全局变量
}
function foo(){
  var a = 1;//声明局部变量a并赋值1
  a = 2;//操作局部变量a赋值2 如果局部没有a这个变量才会向外层作用域找 a赋值
}
function foo(){
  a = 1; 
  var a = 2;//变量声明提升 导致第一句本来全局变量变为局部变量 故等价于下面注释

  // var a;
  // a = 1;
  // a = 2;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题