搜索

首页  >  问答  >  正文

javascript - 函数声明和变量声明优先级

  console.log(f);//function f(){return 1}
    function f(){
        return 1
    }
    var f=2;

之前以为如果函数和变量同名 ,函数声明提升会覆盖变量声明提升,之后测试如下代码

  function f(){
   return 1
}
var f=2;
    console.log(f);//2

console.log(f)位置不同会输出不同,到底是谁覆盖谁呢,还是别的什么原因?
求大神讲解

学习ing学习ing2764 天前893

全部回复(7)我来回复

  • 黄舟

    黄舟2017-06-12 09:30:15

    第一段

     console.log(f);//function f(){return 1}
        function f(){
            return 1
        }
        var f=2;

    相当于=>

    var f;
    function f() {
      return 1
    }
    console.log(f); //function f(){return 1}
    f = 2;




    第二段

      function f(){
       return 1
    }
    var f=2;
        console.log(f);//2

    相当于=>

    var f;
    function f() {
      return 1
    }
    f = 2;
    console.log(f); //2

    参见
    https://www.zhihu.com/questio...

    回复
    0
  • 某草草

    某草草2017-06-12 09:30:15

    不在块中定义函数时, 先提升函数,再提升变量声明. 参考 ECMAScript 5, section 10.5.

    例子如下:

    function f(){}
    var f;
    console.log(f);
    
    var g;
    function g(){}
    console.log(g);
    

    以上输出为 function. 并不是 undefined.所以先提升函数,再提升变量声明.

    回复
    0
  • PHP中文网

    PHP中文网2017-06-12 09:30:15

    JS 解释器会首先提升 var 声明,注意是提升 var 声明语句而不是赋值语句
    然后,才会提升函数声明。因此,才会形成楼上说的情况

    对于第二个情况,感觉和 hoisting 没啥关系。虽然同样提升了 var f,但这里关键在于执行赋值 f = 2 之后才输出的啊。。所以,用来证明 JS 是一个弱类型语言倒是不错的选择= =

    可能我说的有歧义,LZ 还是去看下别人的解释吧

    回复
    0
  • 黄舟

    黄舟2017-06-12 09:30:15

    按ecma的标准,是先提升函数声明的;不过说真的,不管先提升的是谁,结果其实是一样的你知道吗

    回复
    0
  • 为情所困

    为情所困2017-06-12 09:30:15

    第一段代码是变量提升,var f=undefined,变量f指向了function;第二段代码按照JavaScript的执行顺序,把2赋值给了f。

    回复
    0
  • 漂亮男人

    漂亮男人2017-06-12 09:30:15

    js在执行时,会从上往下执行。

    console.log(f);//function f(){return 1}
        function f(){
            return 1
        }
        var f=2;

    这段代码中,函数声明function f和变量声明var f 一起提升,但是函数声明优先级会更高,
    所以代码变成了

    var f;
    function f() {
      return 1
    }
    console.log(f); 
    f = 2;

    f=2(属于赋值,位置不变只是变量声明提升了)

    第二段代码

    function f(){
       return 1
    }
    var f=2;
        console.log(f);//2

    你同样用如上方法理解
    被js引擎理解为

    function f(){
       return 1
    }
    var f;
    f=2;
    console.log(f);//2

    函数f被变量f覆盖,所以输出2

    回复
    0
  • 黄舟

    黄舟2017-06-12 09:30:15

    console.log(e());//error
    
    if(true){
        function e() {
            return 10;
        }
    }
    

    如ycloud所说 以上原因是“函数定义提升只提升到了if 的块作用域内”

    if(true){
    
        function e() {
            return 10;
        }
    }
    console.log(e());//10
    

    如果函数定义提升只提升到了if的块作用域内,那么以上又是什么原因呢?(chrome58测试) 为何外部又能访问if的块作用域内的函数

    回复
    0
  • 取消回复