一道javascript 题目

阅读 5.8k
4 个回答
    var foo = 1;
    function bar() {
      foo = 10;
      return;
      function foo() {}
    }
    bar();
    console.log(foo); //为什么是1而不是10

先分析一下每步流程:
第一步:var foo = 1;
全局变量foo被初始化赋值成1。
第二步:执行bar();方法。
第三步:bar()方法里,函数声明function foo(){}优先处理,这里JavaScript解析语法时(在运行之前)函数优先于一切。所以foo被初始化赋值为function(){};
第四步:执行foo = 10;这里制造了一个假象,认为没有用var 声明指向的是外层foo = 1;。其实不是。而是先在自身函数体里找有没有foo声明,找到之前声明的function foo(){};赋值成10,只是局部变量的值改写。
第五步:输出foo,这时找的是全局变量var foo = 1;输出1。

貌似在js中会先处理变量的声明~~

所以运行到bar内部时,js会先调用foo的声明。

 function bar() {
      foo = 10;//再运行这一行
      return;
      function foo() {};//先运行这一行
    }

等于说在bar中,foo其实指向的是function foo(){},而不是外面的foo

考试题有点扯淡,如果在生产中谁写出这样的代码肯定要拿回去重写的。

bar 方法是函数声明 会在执行前被 解析(hoisted), 存在于当前上下文的任意一个地方


var foo = 1; function bar() { foo = 10; #在此之前 由于下边的函数声明 已经存在一个名为 foo return; #的局部变量 function foo() {} } bar(); console.log(foo);

Hoisting

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