js作用域问题求解答???

    var a= 1;
    function fn1(){
        alert(a);
        a = 2;
    }
    fn1();
    alert(a);

结果 先输出1,之后输出2

想请问一下浏览器执行这个的过程,求懂得人指教

阅读 2.4k
4 个回答

执行fn1()内部的alert(a)时,fn1内部没有变量a,就会去全局作用域中寻找,此时a为1;然后a被赋值为2,所以后面的alert(a)为2

var a = 1就是讲a定义为全局变量,你fn1()执行的时候,fn1函数内部,alert(a)前面并没有定义a,就会在全局作用域中寻找a,所以第一次是alert(1),然后你的a被改为2(第二次的a也是全局的),最下面的那个alert(a)中的a就为2

执行顺序已经有人回答了,所以不再重复了。

其实你想了解执行顺序,可以打断点看下,更加方便和清楚。

你的代码等价于

var a;
function fn1(){
    alert(a);
    a = 2;
}
a = 1;
fn1();
alert(a);

function fn1 提升了,然后是a赋值,第一个1,是fn1里面打印的,打印之后a等于2了,下面再打印就是2了。

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