听罢,黑衣人一惊,这些丹药是今天大长老给的,价值自然不凡。不过他自己的地位也很不一眼,区区几个丹药而已,没啥大不了的。
“好,丹药可以送,但是假如是我赢了,你就必须告诉我你的秘密!” 黑衣人毫不犹豫地答应了。
“好吧,你出题吧!” 叶小凡又看了一眼丹药,心情大好,因为他知道,这些丹药要不了多久就是自己的了。
“哼,我最看不惯的就是你这种随意的态度!”黑衣人感觉自己被轻视了,咬着牙说到。
“现在,你看好,我的储物袋里有五个丹药,我用for循环修改一下代码,给每一个丹药套一层,如果你想要拿到丹药,就得使用get方法。”
var storageBag = {}
for (var i = 0; i < 5; i++) {
storageBag[‘elixir’ + i] = {
get: function(){
return ‘elixir’ + i
}
};
}
console.log(storageBag);
“你说,这样的get函数可以得到每个具体的丹药吗?”黑衣人自信满满地对叶小凡说到。
“当然不行,这样做的话,get函数的返回值都是第5个丹药啦。”叶小凡,看了一眼,想也不想地说到。
听完,黑衣人一惊,本来自己想要借此好好地羞辱叶小凡一番,没想到直接就被叶小凡看出来了!
“哼,别高兴得太早,不错,因为var会进行变量提升,for循环执行结束后,i 的值就变成了5,所以get函数里面的i永远都是5!”
“嗯,这个代码其实相当于这样。”
var i;
for (i = 0; i < 5; i++) {
storageBag[‘elixir’ + i] = {
get: function(){
return ‘elixir’ + i
}
};
}
i 因为是var定义的,所以会自动提升到全局作用域,一旦 i 的值发生变化,其他任何地方的 i 都会变化!
验证:
图1-2
“哼,我刚彻底学会JS闭包大法,现在我就来解决这个问题!” 说着,自信满满的黑衣人就开始运功,一道道代码流被打出来,行云流水。
var i;
for (i = 0; i < 5; i++) {
/** 专门定义一个闭包函数 * */
var closure = function(i){
/** 用来锁住外面的变量i * */
var lock = i;
/** 返回一个函数,让i变量的生命周期得以延续 * */
return function(){
return ‘elixir’ + lock;
}
}
storageBag[‘elixir’ + i] = {
/** 用()执行clousure函数,返回带有lock的函数 * */
get: closure(i)
};
}
"怎么用,叶小凡,这就是闭包的巅峰应用!你能写出比这更完美的代码嘛?"黑衣人说完,就运行了代码
图1-3
果不其然,因为用closure 函数,形成了一个闭包,循环遍历的 i 变量就被锁住了!黑衣人的气息一下子暴涨起来,对叶小凡形成威压!
筑基期后期!
黑衣人正是太上长老的长孙,罗丹!
现在的他,已经到了筑基期后期。之前的外门小比,看到叶小凡竟然会闭包,身为门派内定继承人的他,无法接受。
今天,一定要找回场子,还要扒出叶小凡进步这么快的秘密!
叶小凡感受到来自罗丹的威压,却没有受到丝毫的影响。
“这人竟有筑基后期的修为,哎,又是筑基期,真是令人羡慕啊。”叶小凡感慨一声,随后,用右手的食指轻轻一点。
一股真气朝着那些代码直冲而去,随后,代码发生变化,在原始版本上,叶小凡只改动了一处地方。
for (let i = 0; i < 5; i++) {
storageBag[‘elixir’ + i] = {
/** 用()执行clousure函数,返回带有lock的函数 * */
get: function(){
return ‘elixir’ + i;
}
};
}
叶小凡仅仅是把var i 改成了let i 而已。ES6推荐使用let定义变量,这样就可以实现块级作用域的效果了,内部的变量不会影响全局。在这个例子中,因为for循环中的i用let定义了,那么i的作用域就只在函数体内,不会发生变量提升的情况。
图1-4
效果和用闭包是一样的,但是少了很多的代码!
let强者,竟恐怖如斯!
“这是…ES6的语法!”罗丹不可置信地看着叶小凡。
要知道,能使用ES6的语法,那最起码得有金丹期的境界!而罗丹作为筑基期的巅峰,在千鹤派的年轻一代中,已是翘楚,是天骄。但是,罗丹依然无法使用ES6的语法。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
结尾
学习html5、css、javascript这些基础知识,学习的渠道很多,就不多说了,例如,一些其他的优秀博客。但是本人觉得看书也很必要,可以节省很多时间,常见的javascript的书,例如:javascript的高级程序设计,是每位前端工程师必不可少的一本书,边看边用,了解js的一些基本知识,基本上很全面了,如果有时间可以读一些,js性能相关的书籍,以及设计者模式,在实践中都会用的到。
CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
多时间,常见的javascript的书,例如:javascript的高级程序设计,是每位前端工程师必不可少的一本书,边看边用,了解js的一些基本知识,基本上很全面了,如果有时间可以读一些,js性能相关的书籍,以及设计者模式,在实践中都会用的到。