浅谈JS声明提早

声明提早这个概念对于前端攻城狮来讲是一个很了解的了,可是对于初入前端的新人来讲,这又是一个不得不谈的话题前端

下面我将介绍一下什么是声明提早函数

1 console.log(a);               //undefined
2 var a;
3 a=10;
4 console.log(a)                //10;

如上面代码所示,在我并未定义a时,试着输出a,js并无报错,而是用undefined显示,spa

在第4行输出a时结果是正确显示的,第一行为何不报错呢?code

缘由是这样的,在js中存在这样一种机制,在程序正式执行以前,会将var声明的变量function声明的函数预读到当前做用域的顶部blog

js中的做用域我会在后面的章节中详细去写,在这里你们只须要先将做用域理解成变量生效的位置便可,作用域

但赋值会保留在原位置,这也就造成第一行输出的结果,js真实的过程是将第二行提早到了第一行以前,当js执行到第一行时,开发

因为var a被提早了,但并未赋初始值,因此输出了undefined,到这里你们应该理解了什么是声明提早io

声明提早破坏了程序的执行顺序,因此你们知道原理便可,切勿在实际开发过程当中使用,不只会下降代码可读性,还容易形成程序错误console

function a(){
    console.log(10);  
}
a();                                       //20
function a(){
    console.log(20);      
}
a();                                       //20

如上图所示,本意是想调用这个函数输出10和20,但因为声明提早,后一个a函数将第一个a函数覆盖,10永远没法输出,function

这在生产环境中是很容易产生的,两我的一块儿工做,你声明一个函数或变量,而另外一我的也声明了一个跟你相同的函数或变量,

致使出现的bug很是难以发现和修改,因此在ES6的规定中,建议用let关键字来代替var,采用匿名函数自调(一种解决js全局做用域弊病的方法)的方式

来解决声明提早的问题

 

好啦,若有错误请多指正

相关文章
相关标签/搜索