JS新语法let

使用let 定义变量

首先看到个有意思的问题,为什么let要叫let
Why was the name ‘let’ chosen for block-scoped variable declarations in JavaScript?

一、let可以定义作用在块级作用域的变量

//语法
let var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]];
let test1 = 2;

在react中let几乎可以看为var。
所谓作用在块级可以理解只在一个{}中产生作用,如果在函数中let跟var最大的区别就是var声明变量作用在整个函数中,let情况如下:

letTest() => {
	let test = 1;
	{
		let test = 2; //这是两个不同的变量
	}
}

let甚至影响不到内部的{}
注意:在switch语句中反而因为只有一个块,可能会写出错误。需要在每个case中创建新的块,就是{}括起来

二、在程序和方法的最顶端声明变量,let不会对全局对象新建属性。

var globalProps = 'global';
let globalProps2 = 'block';
console.log(this.globalProps); 
console.log(this.globalProps2); // undefind

注意这种情况下会报错

let globalProps = 'block';
{
	var globalProps = 'global';
}

三、暂存死区

let声明的变量直到他们的定义被执行时才初始化。在变量初始化前访问会异常:ReferenceError。
从块顶部到初始化处理之间,就当成暂存死区。理解为在里面变量是不存在的。
调用typeof检测暂存死区中的变量会抛出异常:ReferenceError。

四、相关例子

function test(){
   var foo = 33;
   {
      let foo = (foo + 55); // ReferenceError
   }
}
test();

由于词法作用域,表达式(foo + 55)内的标识符foo被认为是if块的foo变量,而不是值为33的块外面的变量foo。

在同一行,这个if块中的foo已经在词法环境中被创建了,但是还没有到达(或者终止)它的初始化(这是语句本身的一部分)。

这个if块里的foo还依旧在暂存死区里。
(个人理解:假如能继续运行,这一行后,才算真脱离死区。虽然执行不下去了。也就是调用和声明的时候要注意)
在以下情况下,这种现象可能会使您感到困惑。 let n of n.a已经在for循环块的私有范围内。因此,标识符n.a被解析为位于指令本身(“let n”)中的“ n”对象的属性“ a”。

在没有执行到它的初始化语句之前,它仍旧存在于暂存死区中。

function go(n) {
  // n here is defined!
  console.log(n); // Object {a: [1,2,3]}

  for (let n of n.a) { // ReferenceError
    console.log(n);
  }
}

go({a: [1, 2, 3]});

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值