javascript - 函数声明和变量声明优先级
学习ing
学习ing 2017-06-12 09:28:15
0
7
862
  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
学习ing

全部回复(7)
黄舟

第一段

 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...

某草草

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

例子如下:

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

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

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

洪涛

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

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

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

黄舟

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

为情所困

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

漂亮男人

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

黄舟
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的块作用域内的函数

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板