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)位置不同会输出不同,到底是谁覆盖谁呢,还是别的什么原因?
求大神讲解
第一段
相当于=>
第二段
相当于=>
参见
https://www.zhihu.com/questio...
不在块中定义函数时, 先提升函数,再提升变量声明. 参考 ECMAScript 5, section 10.5.
例子如下:
以上输出为 function. 并不是 undefined.所以先提升函数,再提升变量声明.
JS 解释器会首先提升var
声明,注意是提升 var 声明语句而不是赋值语句。然后,才会提升函数声明。因此,才会形成楼上说的情况对于第二个情况,感觉和 hoisting 没啥关系。虽然同样提升了var f
,但这里关键在于执行赋值f = 2
之后才输出的啊。。所以,用来证明 JS 是一个弱类型语言倒是不错的选择= =可能我说的有歧义,LZ 还是去看下别人的解释吧
按ecma的标准,是先提升函数声明的;不过说真的,不管先提升的是谁,结果其实是一样的你知道吗
第一段代码是变量提升,var f=undefined,变量f指向了function;第二段代码按照JavaScript的执行顺序,把2赋值给了f。
js在执行时,会从上往下执行。
这段代码中,函数声明function f和变量声明var f 一起提升,但是函数声明优先级会更高,
所以代码变成了
f=2(属于赋值,位置不变只是变量声明提升了)
第二段代码
你同样用如上方法理解
被js引擎理解为
函数f被变量f覆盖,所以输出2
如ycloud所说 以上原因是“函数定义提升只提升到了if 的块作用域内”
如果函数定义提升只提升到了if的块作用域内,那么以上又是什么原因呢?(chrome58测试) 为何外部又能访问if的块作用域内的函数