来吧,已经开始此栏的自学!
ES6 给开发人员增添许多令人难忘的优点,当中letURL是当中众所周知。
所以,letURL是甚么小东西?
let 的商业用途
他们忆起呵呵,他们平常在写标识符的这时候,用var来新闻稿两个表达式,除此之外,好似也不行其它的URL了,无论他们新闻稿的是字符串类别、字符串类别却是位数类别等,都用两个var 搞定(即使JavaScript保有静态类别),很方便快捷。但那时,ES6说你,除var,何不试一试用let来新闻稿表达式试一试。
咦,那么说,letURL是用了新闻稿表达式的咯?是的,let的商业用途是用以新闻稿表达式的。
所以,letURL是甚么小东西?
外头的用var新闻稿就能了,为甚么要用捷伊letURL来新闻稿啊?何况用var有甚么严重不足的地方性吗?是的,还真有。
用 var 的严重局限性
严重不足一
来,他们看几段意味深长的标识符:
看标识符,不难猜测标识符的意图是想给字符串a的元素赋值,每两个元素是两个函数,运行后弹出相对应的位数,比如:运行arr[8]();想alert出两个位数8,运行arr[1](); 想alert出两个位数1,依次类推。但是结果并不是他们预想的那样。运行后实际弹出的是10;无论你运行的是arr[8]却是arr[5],或者是字符串内的其它元素,都是alert出两个位数:10。但这并不是他们想要的(不要说你故意那么写的,是想弹出10就好了),为甚么是10呢(往下读,有解释)?至少目前他们能知道了这是var严重不足的地方性。
所以let能解决这个问题吗?ES6说:能啊,不信你试一试!
用let替换var后,他们再看看:
对比呵呵两段标识符,唯一的不同之处是循环的这时候初始化表达式 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个国家认识小明的朋友都会不认识他的,小明当场就懵逼了。
每天都有包括但不限于技术干货、技术动向、职业生涯、行业热点、职场趣事等一切有关程序员的分享.
严重不足二
用var 新闻稿表达式的这时候会出现“表达式提升“的现象。
“ 表达式提升“是甚么鬼?新概念第一次听?前端君快来解释呵呵!再看几段意味深长的标识符:
初学者可能认为:标识符一已经开始已经定义了表达式a,值为1,相当于全局表达式,标识符运行的这时候会先弹出这个全局表达式a的值:1;然后再重新给a赋值为2;可偏偏又事与愿违,心好累啊,它会说你结果是undefined; undefined是未定义啊,为甚么会是未定义呢?
对比呵呵两段意味深长的标识符:var a = 2; 这句标识符被拆分成两部分:新闻稿var a ; 和 定义a = 2;而新闻稿部分被提升(看到了吗?提升两个字出现了)到了标识符块的前面,运行的这时候自己挪到前面了,这是“表达式提升“,结果是:先执行新闻稿,接着就执行alert(a);表达式a只是新闻稿还没定义,就弹出了undefined了。
所以,归根结底是“表达式提升“在作怪。这是var的又一大严重局限性。所以,用letURL在标识符块就不会被提升了吗?是的,不提升了。
如果你用let这样重写刚刚那段标识符的话:
用letURL来定义a;这样a在标识符块内就不会提升了。那为甚么又报错了呢,即使用let新闻稿的变量,在其块级作用域内是封闭的,是不会受到外面的全局表达式a影响的,并且要先新闻稿再使用,所以a的值即不是1(即使不受外面的影响),也不是undefined(即使先新闻稿后使用),更不是2,未新闻稿定义就使用,只有报错啦。
用letURL也算是提醒他们,平常记得先新闻稿定义再使用的好习惯。
光是var的严重不足就讲了那么长的篇幅,希望没把你们闷到,我尽量用一些生活的例子来打比方,如果你能能坚持看到这里很不错了,还有一点,再坚持呵呵。
那么说,let确实能弥补一些var的严重局限性。所以使用let的这时候还有甚么要注意的吗?有的!
注意1:同两个块级作用域内,不允许重复新闻稿同两个表达式。
错误示范一:
错误示范二:
注意2:函数内不能用let重新新闻稿函数的参数
错误示范:
say()函数内用let重新新闻稿了word这个参数,会报错的,千万别那么干。
关于ES6新增的letURL,前端君就讲述那么多,毕竟涉及到标识符,需要集中精力来看,能坚持到看到这里同学,我要谢谢你们,说明这一节写得还算易懂!
更多web前端干货和前端发展动向—
此栏总结
总结:用let新闻稿表达式只在块级作用域起作用,适合在for循环使用,也不会出现表达式提升现象。同两个标识符块内,不可重复新闻稿的相同表达式,不可重复新闻稿函数内的参数。