为了账号安全,请及时绑定邮箱和手机立即绑定

函数声明和声明变量同时存在,提升的规则是什么?

函数声明和声明变量同时存在,提升的规则是什么?

慕容森 2018-11-07 10:18:45
我们知道声明变量是会提升的:var a = 1;//上面一行相当于下面这样: var a; a = 1;同时,函数声明也是会被提升的:foo();function foo(){};//上面两行相当于下面这样: var foo; foo = function (){}; foo()那么,变量和函数声明都有时,谁会提升到更上面呢?怎么排序呢?比如下面这样:var a = 1; foo();function foo(){};是这样吗?var a;var foo; a = 1; foo = function(){}; foo();因为在《你不知道的JAVASCRIPT》看到这句话,有点困惑:函数声明和变量声明都会被提升。但是一个值得注意的细节是,函数会首先被提升,然后才是变量。函数声明会被提升到普通变量之前。所以说会是这样排序吗:var foo; foo = function(){};var a; a = 1; foo();求解排序规则,谢谢!
查看完整描述

1 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

首先,我们可以把它分为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();


查看完整回答
反对 回复 2018-12-14
  • 1 回答
  • 0 关注
  • 452 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号