为啥  var b=3;function  b(){} alert(b)结果为3而var b=3;var b=function(){}  aIert(b);结果为function (){},是因为第一个函数中的b所在的内存与变量3所在的内存不一样么?

解决方案 »

  1.   

    var b=3;function  b(){} alert(b) 你这个b是变量b不是方法名 所以是3var b=3;var b=function(){}  aIert(b); 你相当于给变量重新赋值了 所以是function (){
      

  2.   

    在js中函数和变量都有声明提升的特性,就是不论function语句(函数表达式除外)或者var语句写在哪里,在代码解析时都会自动提升到当前作用域的最前面。注意:只是声明提升,变量的赋值不会提升。
    比如说
    var b=3;
    function b(){}
    alert(b)在代码解析时会变成:function b(){}
    var b;
    /*上边是声明提升的部分*/
    b=3;
    alert(b)

    var b=3;
    var b=function(){}
    alert(b)
    在代码解析时会变成:
    var b;
    /*上边是声明提升的部分*/
    b=3;
    b=function(){}
    alert(b)
      

  3.   

    js引擎有预编译机制,我帮你用预编译翻译下上面两句代码。
    翻译前:var b = 3;function  b(){alert(b)} 
    翻译后:var b; function  b(){alert(b)}; b=3
    ______________________________________________翻译前:var b=3;var b=function(){alert(b)} 
    翻译后:var b; var b; b = 3; b = function(){alert(b)} 预编译 先处理全局变量 -> 再处理全局具名函数 -> 再开始按顺序执行脚本
      

  4.   

    这是因为,没var 一个变量都会存在栈里面(var b 这个变量),  而 function b() {} 会保存在堆里面,当你调用了b方法 里面就会创建一个临时的内存空间 alert(b) ,这时候我们就会去找, 看看栈里面有没有这个变量,有我们就从栈里面提取 出来  因为栈是比堆要小的多, 如果碗里面有个鸡蛋和池塘里面有鸡蛋,哪个会找得快一点,所以这里我们就会输出栈里面的变量所指向3的这个值,其实就相当于一个内存地址.
      

  5.   

    个人认为:第一个是你定义了一个变量b,并且赋值为3,然后又重新声明一个方法名为b的方法,用funtion声明的方法,调用是b();
    第二个是首先定义了一个变量b,并且赋值为3,然后再将b赋值为function(){},此时b=function(){}。
      

  6.   

    var b=3;function  b(){} alert(b);
    var b=3;var b=function(){}  aIert(b);=:赋值  第一个函数3赋予b  第二个function(){}赋予b
    2个值不一样因为在一个函数内,变量前面有var 说明是局部变量, 该变量只能在函数内部有效,跳出本函数失效.
      

  7.   

    赞同3楼大佬,可以参考:https://blog.csdn.net/bingqise5193/article/details/99699793