JS变量名和函数名的提升

来源:互联网 发布:截面数据要做哪些检验 编辑:程序博客网 时间:2024/05/16 17:12
要点)函数声明是函数的声明和实现都被提升了。
           函数表达式和变量表达式只是其声明被提升了。

今天有个朋友问了一个问题:

这个结果打印出来是:a 不是一个函数。
当我看到这个的时候,我第一个想到变量名和函数名一样,有冲突然。所以我把变量名和函数名设置成不一样。


那么其实存在一个问题,函数名和变量名的提升问题。


这个是同事告诉我的,变量名提升的问题。

分析如下:

        一个变量的作用域是程序源码中定义的这个变量的区域。

        全局变量拥有全局作用域,可以定义在 js中的任何地方都有定义。

        局部变量拥有局部作用域,在函数内部定义。

        在函数体内,局部变量的优先级高于全局变量。如果在函数体内申明一个变量与局部变量重名,则会覆盖原先的局部变量。

从第一个模块看出:
局部变量的作用域仅仅在函数内部,出了函数体之后,局部变量就会被销毁。 
在nested()函数中,虽然又声明了一个scope,但是nested()中的scope是局部变量,只是与全局变量的名字相同,并不是全局变量,所以,虽然在该函数中把scope赋值为”嵌套作用域内的局部变量”,但这仅仅是一个与全局变量名称相同的一个变量而已,并没有改变全局变量的值。

第二个模块看出:
看到这里是不是有一些懵逼了,这和刚才不是一样的吗,为什么第二次弹框不一样了呢? 
上面这部分代码中,在nested()函数中,我们并没有用var来声明scope,所以,在这里的scope的作用域就被提升了,即我们将checkscope中的scope的值重置了,所以在输出的时候输出的结果为嵌套作用域内的局部变量。

函数表达式和变量表达式只是其声明被提升,函数声明是函数的声明和实现都被提升。

一、变量提升

在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域 和 函数作用域

变量提升即将变量声明提升到它所在作用域的最开始的部分。下面举个简单的例子

由于js的变量提升,实际上上面的代码是按照 2 执行的。

二、函数提升
js中创建函数有两种方式:函数声明式和函数字面量式。只有函数声明才存在函数提升!


下面一个例子进行分析:

可以解析成: