ES6中的let关键字,有什么用呢?

2022-12-20 0 391

来吧,已经开始此栏的自学!

ES6 给开发人员增添许多令人难忘的优点,当中letURL是当中众所周知。

所以,letURL是甚么小东西?

let 的商业用途

他们忆起呵呵,他们平常在写标识符的这时候,用var来新闻稿两个表达式,除此之外,好似也不行其它的URL了,无论他们新闻稿的是字符串类别、字符串类别却是位数类别等,都用两个var 搞定(即使JavaScript保有静态类别),很方便快捷。但那时,ES6说你,除var,何不试一试用let来新闻稿表达式试一试。

咦,那么说,letURL是用了新闻稿表达式的咯?是的,let的商业用途是用以新闻稿表达式的。

所以,letURL是甚么小东西?

外头的用var新闻稿就能了,为甚么要用捷伊letURL来新闻稿啊?何况用var有甚么严重不足的地方性吗?是的,还真有。

用 var 的严重局限性

严重不足一

来,他们看几段意味深长的标识符:

var arr = [ ]; for(var i=0; i<10; i++){ arr [i] = function(){ alert(i) } } arr [8](); //结果:10

看标识符,不难猜测标识符的意图是想给字符串a的元素赋值,每两个元素是两个函数,运行后弹出相对应的位数,比如:运行arr[8]();想alert出两个位数8,运行arr[1](); 想alert出两个位数1,依次类推。但是结果并不是他们预想的那样。运行后实际弹出的是10;无论你运行的是arr[8]却是arr[5],或者是字符串内的其它元素,都是alert出两个位数:10。但这并不是他们想要的(不要说你故意那么写的,是想弹出10就好了),为甚么是10呢(往下读,有解释)?至少目前他们能知道了这是var严重不足的地方性。

所以let能解决这个问题吗?ES6说:能啊,不信你试一试!

用let替换var后,他们再看看:

var arr = [ ]; for(let i=0; i<10; i++){ arr[i] = function(){ alert(i) } } arr[8](); //结果:8

对比呵呵两段标识符,唯一的不同之处是循环的这时候初始化表达式 i 是使用let,而不是用var,运行arr[8]()后确实弹出了位数8;如果运行的是arr[3](),就会弹出位数3;这才是他们的本意啊,总算实现了,感谢上帝,感谢ES6,感谢letURL!

为甚么用let就能,用var就跑偏了呢?这是即使let新闻稿的表达式仅仅在自己的块级作用域起作用,出了这个块级作用域就不起作用。就好比,小明在国内考的“高级程序员”证,去到国外应聘,别人就不承认你的文凭了,小明只能乖乖待在国内持证上岗。而let新闻稿的表达式也一样,出不了自己的块级作用域。

所以,甚么是块级作用域,怎么才算两个块级作用域?

任何一对花括号(这玩意:{ })中的语句都属于两个块,在花括号里面用let定义的所有表达式在花括号外都是不可见的,他们称之为块级作用域。

怪不得小明的证件去到美国没法使用了,人家认为它的证件“不可见“,是没这回事,不承认你的证。回到标识符中,for循环含有有{ },也是含有了块级作用域,每个表达式 i 都只是在自己的作用域起作用,例如:第10次循环中的 i 的值不会影响到到第9次循环。

如果用var新闻稿的表达式,就不是这种情况了,i 的值会影响到各个块里面的 i,等循环完后 i 等于10,所有块的i都变成了10了。这是为甚么第几段标识符运行后会弹出位数10了,这并不是他们想要的。

就好比小明陆陆续续去了10个国家玩,每到两个国家都给自己弄了两个不同的身份,但是小明被告知以后只能用在第10个国家取得的那个身份,所以之前9个国家认识小明的朋友都会不认识他的,小明当场就懵逼了。

每天都有包括但不限于技术干货、技术动向、职业生涯、行业热点、职场趣事等一切有关程序员的分享.

web前端小白进阶方法笔记,自学资料,面试题和视频,项目源码免费领取shimo.im/docs/JPRdJDVHxKJ3yQGY/%20%E3%80%8Aweb%E5%89%8D%E7%AB%AF%E5%B0%8F%E7%99%BD%E8%BF%9B%E9%98%B6%E6%96%B9%E6%B3%95%E7%AC%94%E8%AE%B0,%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99,%E9%9D%A2%E8%AF%95%E9%A2%98%E5%92%8C%E8%A7%86%E9%A2%91,%E9%A1%B9%E7%9B%AE%E6%BA%90%E7%A0%81%E5%85%8D%E8%B4%B9%E9%A2%86%E5%8F%96%E3%80%8B%EF%BC%8C%E5%8F%AF%E5%A4%8D%E5%88%B6%E9%93%BE%E6%8E%A5%E5%90%8E%E7%94%A8%E7%9F%B3%E5%A2%A8%E6%96%87%E6%A1%A3%20App%20%E6%88%96%E5%B0%8F%E7%A8%8B%E5%BA%8F%E6%89%93%E5%BC%80ES6中的let关键字,有什么用呢?

严重不足二

用var 新闻稿表达式的这时候会出现“表达式提升“的现象。

“ 表达式提升“是甚么鬼?新概念第一次听?前端君快来解释呵呵!

再看几段意味深长的标识符:

var a = 1; (function(){ alert(a); var a = 2; })();//结果:undefined

初学者可能认为:标识符一已经开始已经定义了表达式a,值为1,相当于全局表达式,标识符运行的这时候会先弹出这个全局表达式a的值:1;然后再重新给a赋值为2;可偏偏又事与愿违,心好累啊,它会说你结果是undefined; undefined是未定义啊,为甚么会是未定义呢?

var a = 1; (function(){ var a; alert(a); a = 2; })();

对比呵呵两段意味深长的标识符:var a = 2; 这句标识符被拆分成两部分:新闻稿var a ; 和 定义a = 2;而新闻稿部分被提升(看到了吗?提升两个字出现了)到了标识符块的前面,运行的这时候自己挪到前面了,这是“表达式提升“,结果是:先执行新闻稿,接着就执行alert(a);表达式a只是新闻稿还没定义,就弹出了undefined了。

所以,归根结底是“表达式提升“在作怪。这是var的又一大严重局限性。所以,用letURL在标识符块就不会被提升了吗?是的,不提升了。

如果你用let这样重写刚刚那段标识符的话:

var a = 1; (function(){ alert(a); let a = 2; })(); // 结果:报错a未定义

用letURL来定义a;这样a在标识符块内就不会提升了。那为甚么又报错了呢,即使用let新闻稿的变量,在其块级作用域内是封闭的,是不会受到外面的全局表达式a影响的,并且要先新闻稿再使用,所以a的值即不是1(即使不受外面的影响),也不是undefined(即使先新闻稿后使用),更不是2,未新闻稿定义就使用,只有报错啦。

用letURL也算是提醒他们,平常记得先新闻稿定义再使用的好习惯。

光是var的严重不足就讲了那么长的篇幅,希望没把你们闷到,我尽量用一些生活的例子来打比方,如果你能能坚持看到这里很不错了,还有一点,再坚持呵呵。

那么说,let确实能弥补一些var的严重局限性。所以使用let的这时候还有甚么要注意的吗?有的!

注意1:同两个块级作用域内,不允许重复新闻稿同两个表达式。

错误示范一:

{ var a =1; let a =2; //报错,即使a已经用var新闻稿过 }

错误示范二:

{ let a =1; let a= 2; //却是报错,a已经用let新闻稿过。 }

注意2:函数内不能用let重新新闻稿函数的参数

错误示范:

function say(word){ let word = hello Jack; //报错:用let重新新闻稿word参数 alert(word) } say(hello Lili);

say()函数内用let重新新闻稿了word这个参数,会报错的,千万别那么干。

关于ES6新增的letURL,前端君就讲述那么多,毕竟涉及到标识符,需要集中精力来看,能坚持到看到这里同学,我要谢谢你们,说明这一节写得还算易懂!

更多web前端干货和前端发展动向—

哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibilispace.bilibili.com/275001547

此栏总结

总结:用let新闻稿表达式只在块级作用域起作用,适合在for循环使用,也不会出现表达式提升现象。同两个标识符块内,不可重复新闻稿的相同表达式,不可重复新闻稿函数内的参数。

ES6中的let关键字,有什么用呢?
上一篇: 京东LET?

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务