资讯专栏INFORMATION COLUMN

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

dockerclub / 451人阅读

摘要:若输出为则证明函数声明位于变量声明之前若为说明相反。根据实验结果,我们最后得出的排序结果是总结和反思函数声明会提升到变量声明之前。正确结论是优先级比高,无论在其前后,都会覆盖掉同名的声明。

这是一道新鲜的刚刚出炉的题目,目前只有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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/83015.html

相关文章

  • 译:用let const 来指导JavaScript 变量提升

    摘要:最近在上看到一篇关于变量提升的文章,原文在此。对于刚入门的开发者时常难以理解变量方法提升的独特行为。接下来我们要谈论,,声明,那么先了解变量提升就显得更为重要了。在进入作用域和不能访问的这段时间,我们称为暂时性死区。 showImg(https://segmentfault.com/img/bV0Nsd?w=800&h=450); 最近在Medium上看到一篇关于变量提升的文章,原文在...

    sanyang 评论0 收藏0
  • 弄懂JavaScript作用域闭包

    摘要:关于本书,我会写好几篇读书笔记用以记录那些让我恍然大悟的瞬间,本文是第一篇弄懂的作用域和闭包。作用域也可以看做是一套依据名称查找变量的规则。声明实际上是根据你传递给它的对象凭空创建了一个全新的词法作用域。 《你不知道的JavaScript》真的是一本好书,阅读这本书,我有多次哦,原来是这样的感觉,以前自以为理解了(其实并非真的理解)的概念,这一次真的理解得更加透彻了。关于本书,我会写好...

    everfly 评论0 收藏0
  • ES6学习 第一章 let const 命令

    摘要:外层作用域不报错正常输出块级作用域与函数声明规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。规定,块级作用域之中,函数声明语句的行为类似于,在块级作用域之外不可引用。同时,函数声明还会提升到所在的块级作用域的头部。 前言:最近开始看阮一峰老师的《ECMAScript 6 入门》(以下简称原...

    番茄西红柿 评论0 收藏2637
  • ES5ES6作用域详解

    摘要:允许在块级作用域内声明函数。上面代码中,存在全局变量,但是块级作用域内又声明了一个局部变量,导致后者绑定这个块级作用域,所以在声明变量前,对赋值会报错。 ES5的作用域 变量起作用的范围,js中能创建作用域的只能是函数 { let a = 1; var b = 2; } console.log(a); // a is not defined console.log(b); //...

    Dr_Noooo 评论0 收藏0
  • ES2015系列--块级作用域

    摘要:在的闭包中,闭包函数能够访问到包庇函数中的变量,这些闭包函数能够访问到的变量也因此被称为自由变量。在之前最常见的两种作用域,全局作用局和函数作用域局部作用域。 关于文章讨论请访问:https://github.com/Jocs/jocs.... 当Brendan Eich在1995年设计JavaScript第一个版本的时候,考虑的不是很周到,以至于最初版本的JavaScript有很多不...

    darkbug 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<