理解:JS变量名和函数名的提升

要点)函数声明是函数的声明和实现都被提升了。
           函数表达式和变量表达式只是其声明被提升了。
 
今天有个朋友问了一个问题:
 
 
这个结果打印出来是:a 不是一个函数。
当我看到这个的时候,我第一个想到变量名和函数名一样,有冲突然。所以我把变量名和函数名设置成不一样。
 
 
那么其实存在一个问题,函数名和变量名的提升问题。
 
 
这个是同事告诉我的,变量名提升的问题。
 
分析如下:
 
        一个 变量的作用域是程序源码中定义的这个变量的区域。
 
          全局变量拥有全局作用域,可以定义在 js中的任何地方都有定义。
 
          局部变量拥有局部作用域,在函数内部定义。
 
        在函数体内, 局部变量的优先级 高于 全局变量。如果在函数体内申明一个变量与局部变量重名,则会覆盖原先的局部变量。
 
从第一个模块看出:
局部变量的作用域仅仅在函数内部,出了函数体之后,局部变量就会被销毁。 
在nested()函数中,虽然又声明了一个scope,但是nested()中的scope是局部变量,只是与全局变量的名字相同,并不是全局变量,所以,虽然在该函数中把scope赋值为”嵌套作用域内的局部变量”,但这仅仅是一个与全局变量名称相同的一个变量而已,并没有改变全局变量的值。
 
第二个模块看出:
看到这里是不是有一些懵逼了,这和刚才不是一样的吗,为什么第二次弹框不一样了呢? 
上面这部分代码中,在nested()函数中,我们并没有用var来声明scope,所以,在这里的scope的作用域就被提升了,即我们将checkscope中的scope的值重置了,所以在输出的时候输出的结果为嵌套作用域内的局部变量。
 
函数表达式和变量表达式只是其声明被提升,函数声明是函数的声明和实现都被提升。
 
一、变量提升
 
在ES6之前,JavaScript没有 块级作用域(一对花括号{}即为一个块级作用域),只有 全局作用域 和  函数作用域
 
变量提升即将变量声明提升到它所在作用域的最开始的部分。下面举个简单的例子
 
由于js的变量提升,实际上上面的代码是按照 2 执行的。
 
二、函数提升
js中创建函数有两种方式:函数声明式和函数字面量式。只有函数声明才存在函数提升!
 
 
下面一个例子进行分析:
 
可以解析成:
 
 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值