这是一道新鲜的刚刚出炉的题目,目前只有2个回答,处于未解决状态。
题目链接在这:好奇心爆棚的我听着电音思考了一发,应该没错吧。var a=1;foo();function foo(){};
首先,我们可以把它分为4块内容
var a ;a =1;foo();function foo();
我们想知道提升后排序是什么形式?
目前已知条件是,变量声明会提升到变量赋值之前,所以我们可以先将变量声明放到前两位,暂时不管其内部顺序:var a ;function foo(){};a=1;foo();
接下来我们来分别确定声明和赋值模块的内部排序。
为了进行实验,我们对foo函数进行扩充,所以现在的排序为:var a;function foo(){console.log(a+1)};a=1;foo();
先不要管为什么这么改,我们继续实验,实验过程中会理解。
为了便于理解,实验分两次进行。首先:我们对变量声明模块进行实验。var a=1;console.log(foo);//若输出为function foo(){}则证明函数声明位于变量声明之前;若为undefined,说明相反。foo();function foo(){console.log(a+1)};
然后:我们对变量赋值模块进行实验。
var a=1;foo();//若输出为undefined1,则证明foo()在a=1之前;若输出为2,则说明a=1在foo()之前。function foo(){console.log(a+1)};
下面来进行实验:
var a=1;console.log(foo);//若输出为function foo(){}则证明函数声明位于变量声明之前;若为undefined,说明相反。foo();function foo(){console.log(a+1)};VM1099:2 function foo(){console.log(a+1)}VM1099:4 2
根据实验结果,我们最后得出的排序结果是:
function foo(){};var a;a=1;foo();
总结和反思:
1.函数声明会提升到变量声明之前。2.提升只针对的是声明部分,即出现var funtion等的地方,后续的赋值和函数调用按照当前默认顺序依次执行。
前端菜鸟一只,若有不对的地方请及时指正! 期待与您交流!
------更新------2018.5.22------
结论是错误的,原因是console.log()是异步函数,导致实验结果不准确。正确结论是:function优先级比var高,无论在其前后,都会覆盖掉同名的var声明。console.log(typeof foo);var foo = "foo";function foo(){}
输出:function
console.log(typeof foo);function foo(){}var foo = "foo";
输出:function