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)位置不同会输出不同,到底是谁覆盖谁呢,还是别的什么原因?
求大神讲解
黄舟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...
某草草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.所以先提升函数,再提升变量声明.
PHP中文网2017-06-12 09:30:15
JS 解释器会首先提升 var
声明,注意是提升 var 声明语句而不是赋值语句。然后,才会提升函数声明。因此,才会形成楼上说的情况
对于第二个情况,感觉和 hoisting 没啥关系。虽然同样提升了 var f
,但这里关键在于执行赋值 f = 2
之后才输出的啊。。所以,用来证明 JS 是一个弱类型语言倒是不错的选择= =
可能我说的有歧义,LZ 还是去看下别人的解释吧
漂亮男人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
黄舟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的块作用域内的函数