暂时性死区
let 存在变量提升,但是与 var 不同的是,var 的变量提升的同时会默认赋值为 undefined. 而 let 仅仅发生了提升而已,并不会赋任何值给变量,在显式赋值之前,任何对变量的读写都会导致 ReferenceError 的报错。若在声明之前使用变量,就会报错。在代码块内,使用 let 命令声明变量之前,该变量都是不可用的。从代码块(block)起始到变量求值(包括赋值)以前的这块区域,称为该变量的暂时性死区。
console.log(a); //报错
let a = 123;
产生原因
当程序的控制流程在新的作用域进行实例化时,在此作用域中用let/const声明的变量会先在作用域中被创建出来,但因此时还未进行词法绑定,所以是不能被访问的,如果访问就会抛出错误。因此,在这运行流程进入作用域创建变量,到变量可以被访问之间的这一段时间,就称之为暂时死区。
暂时性死区带来的影响
- let所声明的变量一定要在声明后使用,否则报错
- let不允许在相同作用域内,重复声明同一个变量
- typeof 不再是一个百分之百安全的操作
typeof的“死区”陷阱
使用typeof 可以用来检测给定变量的数据类型,也可以使用它来判断值是否被定义。当返回undefined时表示值未定义; 但是在const/let定义的变量在变量声明之前如果使用了typeof就会报错
typeof x; // ReferenceError
let x;
只是用了typeof而没有去定义,也是不会报错的,可以看出只要没有明确规定使用const/let定义之前就是不会出错。
typeof y; // 'undefined'
关于getElementsByClassName()
<div id="one" class="two">
<span class="three">times</span>
</div>
var ttt=Id.getElementsByClassName("three");
var eee=Id.getElementsByClassName("three")[0];
ttt.onclick=function(){
console.log("111")
}
eee.onclick=function(){
console.log("111")
}
ttt的onclik执行不了,eee的onclick可以执行.
原因分析
- ttt获取的是(没有[0])所有classname为three的节点,类似整个数组,即使它只有一个(此时数组长度为一)
- 而eee获取的是(有[0]):事件绑定一个对象,eee获取的是对象
HTML点击按钮button跳转页面的几种实现方法
- location.href=(‘跳转页面的地址’)//在本页面打开
- window.open(‘跳转页面的地址’) //打开新页面