这是一道新颖的方才出炉的问题,如今只要2个回复,处于未处理状况。
问题链接在这:https://segmentfault.com/q/10…
好奇心爆棚的我听着电音思索了一发,应当没错吧。
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