《JavaScript百炼成仙》续集01. let强者,竟恐怖如斯

简介: 前些天发现了一个巨牛的人工智能学习博客,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转

前些天发现了一个巨牛的人工智能学习博客,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转


这一日夜晚,月光皎洁,洒洒地落在青山院西南边的一座小山上。这座小山大约是没有具体的名字,可既然靠着青山院,大家都愿意就叫它青山。


这时候,青山上一隅闪过一个身手矫健的人影,正是刚刚吐纳完毕的叶小凡。得到红衣底子的身份后,叶小凡一时风光无两,但是修道之人,切不可因为一时的名利而沾沾自喜,这是平时叶老对自己的教导。


所以,叶小凡更喜欢独自一人来到青山上修炼。


“哎呀,又是充实的一天啊。”叶小凡猛地吸了一口夜晚的凉气,脸蛋也显现出健康的红色。


炼气期巅峰!


这正是叶小凡当前的修为,可是这个境界只有他一个人知道,虽说这个境界也还可以,可是叶小凡却怎么也高兴不起来。


要知道,炼气期巅峰在所有的红衣弟子中,是最低的境界了。上次基础考核遇到的林涛师兄,现在据说已经到了筑基后期。可是,就连叶小凡自己也不知道怎么回事,怎么也无法突破炼气期。


炼气期,准确来说,都无法算是一个境界。那是修道之人必须经历的一个阶段,而唯有踏入筑基,哪怕是最差的人道筑基,才算是真正踏入了修真的道路。


“叶老,你说我究竟是怎么回事,为什么迟迟都无法进入筑基期呢?”叶小凡郁闷道。


“你这种情况确实特殊,在我那个年代,也未曾遇到过。”戒指中的叶老也啧啧称奇,按理说,叶小凡的修为肯定是远远不止炼气期的。毕竟,有自己的悉心指导,再加上叶小凡天资聪慧,绝无可能卡在炼气期,无法再进一步!


“嗯?” 突然,叶小凡丹田一热,感应到了什么。一股能量从丹田处涌了上来,于是叶小凡立刻盘膝而坐,他知道,又要突破了。


大约过了一刻钟,能量值升至最大,叶小凡额头微微冒汗,大喝一声,一阵白光闪过。


叶小凡又突破了!


“嗯?我现在已经到了炼气期99层了!” 叶小凡凝视自己的内存远海,惊讶道,可随即又是一阵失落感。


“哎呀,叶老,你看我都炼气期99层了,难道真要达到炼气期100层才能突破进入筑基期吗?”


“小娃娃,你莫要着急,别忘了我平时是怎么教导你的。修真之途,切勿急躁!你这体质可能确实特殊,但这也是好事,毕竟你现在的修为是实打实的。就连老夫也没有见过,还有谁能到炼气期99层还不突破的。”


叶小凡嗯了一声,平复了一下心态。


就在这时,迎面来了一个黑衣人,拦住了叶小凡。


“又来?”叶小凡看见黑衣人,并不紧张,因为这不是第一次了。最近这个黑衣人总是突然出现,挑战自己。


“叶小凡,我已掌握闭包的精华, 这次,你,赢不了我!” 黑衣人自信满满,随即就扔出一个储物袋。

var storageBag = {}

储物袋一开,发现里面出现五颗丹药。

var storageBag = {}
for (var i = 0; i < 5; i++) {
    storageBag['elixir' + i] = '丹药' + i;
}
console.log(storageBag);

811ee5027069f329c896b01aa4f1f09d.png


打印效果如图1-1所示。


"嗯?"叶小凡看到丹药,因为在叶老的教导下,叶小凡的丹道境界已经到了宗师境界,一眼就看出这丹药的品阶不低!


“这个人到底是什么来头,这些丹药都价值不菲啊!”


于是,叶小凡微微一笑,说到:“这位同门,不管这次比什么,假如又是我胜了,这些丹药你送我如何?”


听罢,黑衣人一惊,这些丹药是今天大长老给的,价值自然不凡。不过他自己的地位也很不一眼,区区几个丹药而已,没啥大不了的。


“好,丹药可以送,但是假如是我赢了,你就必须告诉我你的秘密!” 黑衣人毫不犹豫地答应了。


“好吧,你出题吧!” 叶小凡又看了一眼丹药,心情大好,因为他知道,这些丹药要不了多久就是自己的了。


“哼,我最看不惯的就是你这种随意的态度!”黑衣人感觉自己被轻视了,咬着牙说到。


“现在,你看好,我的储物袋里有五个丹药,我用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 都会变化!

验证:864859d6461077eed741caf5f7b96191.png

“哼,我刚彻底学会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)
    };
}

"怎么用,叶小凡,这就是闭包的巅峰应用!你能写出比这更完美的代码嘛?"黑衣人说完,就运行了代码

895806ffbaf96f616aa1f9feb670f798.png

果不其然,因为用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的作用域就只在函数体内,不会发生变量提升的情况。

6f9972e39884437a223e1a847a4c8b1f.png

效果和用闭包是一样的,但是少了很多的代码!


let强者,竟恐怖如斯!


“这是......ES6的语法!”罗丹不可置信地看着叶小凡。


要知道,能使用ES6的语法,那最起码得有金丹期的境界!而罗丹作为筑基期的巅峰,在千鹤派的年轻一代中,已是翘楚,是天骄。但是,罗丹依然无法使用ES6的语法。


这个叶小凡,可恨!他到底是用了什么办法,他的气息,明明只有炼气期啊!


罗丹内心狂吼,脸上却没有太多的脸色变化。但是他知道,自己又败了。


“我输了,叶小凡,下一次,我必定胜你!”说完,罗丹头也不回地就准备离开。


“哎哎,这位同门,你的丹药还没送我呢!”叶小凡看罗丹要走,急忙喊道。


罗丹愣了一下,看了下储物袋里面的五颗丹药,这是太上长老今天特意给自己的,说后面会用到,要好好保存。其实罗丹自己也不知道这些丹药的价值是多少。


可是,既然话说出去了,不给的话面子上又挂不住。于是,罗丹连着储物袋朝叶小凡一扔,然后立刻化作一道灵光飞去。


这个地方,他是一刻也不想多待。


相关文章
|
3月前
|
JavaScript 前端开发 应用服务中间件
JavaScript 变量声明详解const 、let、 var
JavaScript 变量声明详解const 、let、 var
29 1
|
1月前
|
JavaScript 前端开发 开发者
js开发:请解释什么是ES6的let和const关键字,以及它们与var关键字的区别。
ES6引入`let`和`const`替代`var`声明变量。`let`有块级作用域,存在暂时性死区,不进行变量提升,可重新赋值。`const`用于常量,值不可变但引用类型内容可变,同样有块级作用域和暂时性死区。与`var`主要区别在于作用域、变量提升和可变性。这些改进提高了代码的可预测性和安全性。
24 2
|
1月前
|
JavaScript
JS中var、let、const的区别
JS中var、let、const的区别
|
4月前
|
JavaScript 前端开发
JavaScript基础知识:`var`、`let` 和 `const` 的区别是什么?
JavaScript基础知识:`var`、`let` 和 `const` 的区别是什么?
25 0
|
4月前
|
JavaScript 前端开发
JavaScript开发中ES6+新特性:介绍一下let和const与var的区别。
JavaScript开发中ES6+新特性:介绍一下let和const与var的区别。
28 1
|
4月前
|
JavaScript 前端开发 开发者
|
6月前
|
JavaScript 前端开发
js的let、const、var的区别以及应用案例
js的let、const、var的区别以及应用案例
|
7月前
|
JavaScript 前端开发
理解JavaScript中const、let和var的区别
JavaScript中的变量声明关键词const、let和var在不同情况下具有不同的作用和行为。在本博客中,我们将深入研究这三者之间的区别,以帮助您更好地理解它们在代码中的应用场景和行为。
181 0
|
8月前
|
JavaScript 前端开发
JavaScript 中 let和var区别
JavaScript 中 let和var区别
|
8月前
|
前端开发
前端学习笔记202305学习笔记第三十三天-js-使用let声明变量的特点
前端学习笔记202305学习笔记第三十三天-js-使用let声明变量的特点
34 0