请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

关于 typeof 的暂时性死区,了解一下

[复制链接]
查看: 19|回复: 0

7856

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
31850
发表于 2019-11-9 11:45 | 显示全部楼层 |阅读模式
将常识转化为本事,焦点是把握20%行业焦点技术,把进修培养成风尚,持续深耕,用本事打点题目,方能持续成长!那末根柢好,就是必须条件。
近来看 数据典范,晓得数据典范判定有三种方式,typeof 是其中一种,严重用来判定根柢典范(8中,string, number, boolean, undefined, object, function, symbol, bigint),可是也有弱点,“临时性死区”。
“临时性死区”?这是什么?了解一下。下面进入正题。
临时性死区

只要块级感化域内存在let命令,它所声明的变量就“绑定”(binding)这个地域,不再受内部的影响。
  1. var tmp = 123; if (true) {  tmp = 'abc'; // ReferenceError  let tmp;}
复制代码
上面代码中,存在全局变量tmp,可是块级感化域内let又声大白一个部分变量tmp,致使后者绑定这个块级感化域,所以在let声明变量前,对tmp赋值会报错。
ES6 大白规定,假如区块中存在let和const命令,这个区块对这些命令声明的变量,从一路头就构成了封锁感化域。凡是在声明之前就操纵这些变量,就会报错。
总之,在代码块内,操纵let命令声明变量之前,该变量都是不成用的。这在语法上,称为“临时性死区”(temporal dead zone,简称 TDZ)。
  1. if (true) {  // TDZ起头  tmp = 'abc'; // ReferenceError  console.log(tmp); // ReferenceError   let tmp; // TDZ竣事  console.log(tmp); // undefined   tmp = 123;  console.log(tmp); // 123}
复制代码
上面代码中,在let命令声明变量tmp之前,都属于变量tmp的“死区”。
“临时性死区”也意味着 typeof 不再是一个百分之百平安的操纵。
  1. typeof x; // ReferenceErrorlet x;
复制代码
上面代码中,变量x操纵let命令声明,所以在声明之前,都属于x的“死区”,只要用到该变量就会报错。是以,typeof运转时就会抛出一个ReferenceError。
作为比力,假如一个变量底子没有被声明,操纵typeof反而不会报错。
  1. typeof undeclared_variable // "undefined"
复制代码
上面代码中,undeclared_variable是一个不存在的变量名,成果返回“undefined”。所以,在没有let之前,typeof运算符是百分之百平安的,永久不会报错。现在这一点不建立了。这样的筹划是为了让大野生成杰出的编程风尚,变量必定要在声明以后操纵,否则就报错。
有些“死区”比力匿伏,不太轻易发现。
  1. function bar(x = y, y = 2) {  return [x, y];} bar(); // 报错
复制代码
上面代码中,挪用bar函数之所以报错(某些实现大要不报错),是由于参数x默许值即是另一个参数y,而此时y还没有声明,属于”死区“。假如y的默许值是x,就不会报错,由于此时x已经声大白。
  1. function bar(x = 2, y = x) {  return [x, y];}bar(); // [2, 2]
复制代码
此外,下面的代码也会报错,与var的活动差别。
  1. // 不报错var x = x; // 报错let x = x;// ReferenceError: x is not defined
复制代码
上面代码报错,也是由于临时性死区。操纵let声明变量时,只要变量在还没有声明完成前操纵,就会报错。上面这行就属于这个情况,在变量x的声明语句还没有实行完成前,就去取x的值,致使报错”x 未界说“。
总结

ES6 规定临时性死区和let、const语句不出现变量提拔,严重是为了淘汰运转时毛病,避免在变量声明前就操纵这个变量,从而致使料想之外的活动。这样的毛病在 ES5 是很常见的,现在有了这类规定,克植毛病就很轻易了。
总之,临时性死区的本质就是,只要一进入当前感化域,所要操纵的变量就已经存在了,可是不成获得,只要等到声明变量的那一行代码出现,才可以获得和操纵该变量。

免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 妈妈网-中国妈妈第一,是怀孕、育儿、健康等知识交流传播首选平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表