JavaScript-ES6新增块级作用域-笔记-变量提升

ES5中是不存在块级作用域的。
ES6中开始出现。

1. 块级作用域与普通变量

例子:

function f() {
	let n = 5
	if (true) {
		let n = 10
	}
	console.log(n) // 5
}

以上代码中有两个代码块 可见输出的是外部的n 值为 5,这表示外层代码块不受内层代码块的影响

这其实也是 let在发挥作用,假使if代码块内部使用的不是let而是var,那么输出的值就会是 10

这意味着:内层作用域可以定义外层作用域的同名变量,并且两个作用域中的同名变量互不影响

2. 块级作用域与函数声明

我们先复习两个概念:

  • 函数声明
function f() { console.log("123") }
  • 函数表达式
var f = function () { console.log("123") }

ES5规定函数只能在顶层作用域和函数作用域之内。
ES6明确允许在块级作用域内声明函数

例子:

function f() { console.log("out") }
(function () {
	if (false) {
		function f() { console.log("inside") }
	}
	f() // undefined
} ())

这段代码当时疑惑了我很久,于是我去问学姐们。
学姐解释了一会儿,再加上我百度,得出了以下结论:
立即执行函数中,我们在 一个条件一定为 falseif 语句代码块内部 对一个在外部已经进行过声明的函数进行声明

会发生什么呢,function f() { console.log("inside") }语句会将if语句击穿,也就是说,进行变量提升

这里 if 后括号内的 falsetrue 的区别就是:
如果是true,会对f进行重新声明,最终打印“inside”;
如果是false,那么该语句会自动进行 函数声明函数表达式的转换,
即:function f() { console.log("inside") } -> var f = function () { console.log("inside") }
但是提升 只会提升var f这部分,对函数进行赋值的部分不会得到提升,这就是例子中结果为undefined的原因(var f 这句代码没有给f初始值,所以值为undefined)。

如果if的代码块不写在函数(普通函数大概也是,我试过一两个情况)内,就不会发生这种迷惑的情况。(大概)

3. 关于变量提升

简单几句话概括一下,
如果在一个代码块中 我们在一个 变量声明并赋值 之前使用了它,前提是之后进行了声明和赋值,那么,如果输出这个变量的话,不会报错,会输出undefined,这就是变量提升

console.log(a) // undefined
var a = "我喜欢的是二次元美少女,谢谢!"

实际上 ES6 会操作一波,让代码变成这样:

var a
console.log(a)
a = "我喜欢的是二次元美少女,谢谢!"

暂时这样子吧。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值