cari

Rumah  >  Soal Jawab  >  teks badan

javascript - 这段js代码打印出来的结果为什么是这样的?

var a = 1;
var b = function(){
    console.log(a);  // function a(){}
    a = 10;
    console.log(a);  //10
    return;
    function a(){} //声明提升
}
b();
console.log(a);   //1 为什么是这个数?

最后打印出来的a值,不应该是10吗?为什么是1呢?

伊谢尔伦伊谢尔伦2821 hari yang lalu1170

membalas semua(14)saya akan balas

  • 阿神

    阿神2017-04-10 16:30:55

    函数声明同时也创建了一个和函数名相同的变量
    参考:MDN函数——Function构造函数vs函数声明vs函数表达式
    所以,函数作用域中的代码执行顺序就相当于下面这样了:

    var b = function(){
        var a;//函数声明提升的同时创建了一个同名的变量
        function a(){}
        console.log(a);//函数声明覆盖变量声明,结果为function a(){}
        a = 10;
        console.log(a);//变量初始化覆盖函数声明,结果为10
        return;    
    }

    这表明在b函数作用域内又声明了一个变量a,覆盖了全局变量a,发生的一切都是在函数作用域内。
    b函数外的console.log(a);访问的自然是全局变量a了,因为它访问不到b函数作用域内的变量。

    关于变量声明提升VS函数声明提升,顺序谁在前谁在后参考变量声明提升VS函数声明提升

    balas
    0
  • 天蓬老师

    天蓬老师2017-04-10 16:30:55

    我的理解,function a(){},相当于在局部作用域b函数中定义了一个a函数,a=10是对b作用域中的a赋值,此时局部作用域b中的a从函数变成一个常量。至始至终没有改变b外作用域中的a=1的值。

    balas
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 16:30:55

    因为b函数里面的a=10并不是全局变量啊,而是对function a(){} 的重新赋值 。^_^!

    balas
    0
  • 高洛峰

    高洛峰2017-04-10 16:30:55

    其实,你已知道声明提升,只是最后被代码搞乱了而已,把它整理成下面这样,就一目了然了,全局的变量a就没被改变过:
    var a = 1;
    var b = function(){
    var a = function (){};

    console.log(a);
    a = 10;
    console.log(a);
    return;
    //function a(){}

    }
    b();
    console.log(a);

    balas
    0
  • PHPz

    PHPz2017-04-10 16:30:55

    声明有有两种,且仅有两种,var 以及 function ,所以调用了 b()就相当于在里面开了块动态内存,重新声明了个变量 a,这两个a 所处的内存位置都不一样,自然不是同一个了,b(){}里面的a,根本就不是外面的a,而且把b()调用执行了一次,那块内存就消失了。故尔,他们说外面的为全局变量,里面的就是局部变量,就是这个道理了!

    balas
    0
  • PHP中文网

    PHP中文网2017-04-10 16:30:55

    既然都理解了function a(){}是函数的提前声明,怎么会不理解输出1呢,一开始在函数内部声明了一个局部变量a,由于执行上下文的特性缘故,执行函数时a变量就是一个函数了a=10只是将你内部的局部变量更改了,也就是把你的那个function改变为了'number'类型的变量,执行函数后,这个局部变量就会被销毁。

    balas
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 16:30:55

    b里的a,实际是function

    balas
    0
  • 怪我咯

    怪我咯2017-04-10 16:30:55

    js的变量作用域啊
    http://blog.csdn.net/beijiguangyong/article/details/8301707

    balas
    0
  • PHPz

    PHPz2017-04-10 16:30:55

    var a = 1;
    var b = function(){
        console.log(a);
        a = 10;
        console.log(a);
        return;
        function a(){}
    }
    b();
    console.log(a);

    你也知道 b 函数里的 function a(){} 提升了,所以 b 函数里所有对 a 的操作其实都是重新赋值

    这里说的 a 是局部的,是 b 函数内的
    这里说的 a 是局部的,是 b 函数内的
    这里说的 a 是局部的,是 b 函数内的

    所以最后一句 console.log(a) 是打印全局的 a,也就是一开始初始化的 1

    balas
    0
  • 黄舟

    黄舟2017-04-10 16:30:55

    js中函数有局部作用域,因此函数内部的a和外部的a并不是一个变量。

    balas
    0
  • Batalbalas