es6-块级作用域绑定之我见

1 篇文章 0 订阅

1.es6引进块级作用域来强化对变量生命周期的控制

2.块级作用域(亦称词法作用域)存在于:

函数内部

块中(字符{和}之间的作用域)

3.let声明语句放在封闭代码块顶部

4.执行流离开if块,value立刻被销毁。如果condition的值为false,就永远不会声明并初始化value

代码:

if(condition){

let value = "blue"

return

}

5.假设作用域中已经存在某个标识符,此时再使用let关键字声明他就会出错

6.但如果当前作用域内嵌另一个作用域便可以在内嵌作用域使用let声明同名变量,例如:

var count = 10;

if(condition){

let count = 1000

}

此处内部块中的count会遮蔽全局作用域中的count,后者只有在if语句外才能访问

7.使用const声明的是常量,其值一旦被设定后不可更改。因此每个通过const声明的常量必须进行初始化

8.const与let声明的都是块级标识符,所以常量也只有在当前代码内有效,一旦执行到块外立刻被销毁。敞亮同样也不会被提升至作用域顶部

9.无论在严格模式下还是非严格模式下,都不可以为const定义的常量再赋值

10.js中的常量如果是对象,那么对象中的值可以被修改

11.记住,const声明不允许修改绑定,但允许修改值。也就意味着用const声明对象之后可以修改对象的属性值

12.临时死区:如果在声明之前访问这些变量,即使是相对安全的typeof操作符也会出发错误,例如:

if(condition){

console.log(typeof value)

let value = "blue"

}

此时的value还位于js所谓的临时死区或tdz中。虽然es标准没有明确提到tdz,但人们却常用它来描述let和const的不提升效果

js引擎在扫描发现变量声明的时候,要么将他们提升到作用域顶部(var),要么将声明放到tdz中(let和const)。访问tdz中的变量会触发运行时异常。只有在执行过变量声明语句之后,变量才会从tdz中移除,然后正常访问

js引擎会先装载(找到声明语句)再执行:这就解释了为什么会先扫描到声明变量,然后再提升或者是放到tdz中

但在let声明作用域的外部,对该变量使用typeof则不会报错,例如:

const.log(typeof value)//undefined

if(condition){

let value = "blue"

}

此时value不在tdz中,也就意味着不存在value这个绑定,typeof最终返回undefined

tdz只是块级绑定的特点,这段代码中value的使用和声明不在用一个作用域块中

13.循环中的函数中:

var funcs = [];

for(var i = 0;i<10;i++){

funcs.push(function(){

console.log(i)

})

}

funcs.forEach(function(func){

func()//输出10次数字10

})

根据我的理解:

每循环一次,funcs.push这个语句会把一个函数送数组中,此函数为function(){console.log(i)},放进去之后,随着i不断增加,直到i=10为止,开始执行循环外的代码funcs.forEach(..)每次都在执行console.log(i),此时i已然成为10

使用立即执行函数:

var funcs = [];

for(var i = 0;i<10;i++){

funcs.push((function(){

console.log(i)

})(i))

}

funcs.forEach(function(func){

func()

})

在循环内部,iife表达式为接受的每一个变量i都创建一个副本并储存变量value,这个变量的值就是相应迭代创建的函数所使用的值

如果使用let:每次迭代循环都创建一个新变量,并以之前迭代中的同名变量值将其初始化,所以循环内部创建每一个函数都能得到属于自己的i

14.全局块作用域绑定:当var被作用域全局作用域的时候,他会创建一个新的全局变量作为全局对象(浏览器环境中的window对象)的属性。这意味着用var很有可能无意中覆盖一个已经存在的全局变量

如果你在全局作用域使用let或者const,会在全局作用域下创建一个新的绑定,但该绑定不添加到全局作用域的属性中。

如果希望在全局对象下定义变量,仍然可以使用var,这种情况常常用域跨frame或者跨window访问代码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值