ECMA Script的closure和循环变量

ECMA Script中的所有函数都是闭包(closure)。有的时候闭包的行为和直觉不一样,例如:


var func = [];

for (var i = 0; i < 5; i++) {
    func.push(function() {
        console.log(i);
    });
}

for (var j = 0; j < func.length; j++) {
    func[j]();
}

这段代码的输出结果并不是0、1、2、3、4,而是5、5、5、5、5。

第一个for循环中一共创建了5个闭包,每个闭包输出循环变量i的值,它们被保存到数组func中。
循环结束后,执行5个闭包,它们的输出的都是5。

在ECMA Script中,每个闭包是由函数定义(code)和词法环境(lexical environment)组成。词法环境中含有闭包函数定义中用到的变量的引用。"词法环境"中"词法"的含义在于它的创建是在闭包创建的时候发生的, 与之对应的是动态环境(dynamic environment)。我会在另一篇博客中详细解释两者的区别。刚才的闭包相当于:

let closure = {

code: fn // reference to function

environment: {i}, // variables reference

};

因为闭包在循环结束后执行, 它们的词法环境中的变量i的值是循环结束时i的值, 也就是我们见到的5。

如果想要输出0、1、2、3、4,其中一种方法是


for (var i = 0; i < 5; i++) {
    func.push((function(x) {
        return function() {
            console.log(x);
        }})(i));
}

这种方法的闭包是匿名函数返回的。闭包中使用的变量x,是匿名函数执行时候的参数。匿名函数执行时,参数的值即为循环变量的值,值得注意的是参数和循环变量虽然是相同的值,但它们是两个不同的变量。匿名函数返回后,返回的闭包的词法环境中保存了参数变量,因为没有其他代码修改它的值,所以在执行闭包的时候会输出0、1、2、3、4。

通过理解闭包和词法环境的概念可以在概念上解释清楚这个循环的问题。以后的博客里,我会使用开发工具来看看实际程序运行过程中闭包和词法环境的具体实现是如何的。

Advertisements

番茄工作法

番茄工作法用来解决时间管理问题。

每次专心工作25分钟之后,休息5分钟。

工作的时候不休息,休息的时候不工作。

这种方法可以集中精力,提高效率。

 

mastic acrylique和mastic silicone的区别

这两种材料都是用来处理施工的joint.
比如:
把木板粘在墙上, 厨房plan de travail和瓷砖的连接处的防水.

mastic和silicone在商店里包装一样, 操作方法类似, 很容易混淆.

他们的主要区别有:

mastic 可以上漆, 容易覆盖, 适合填补墙上的小洞, 填满木板之间的缝隙. 但是mastic不防水.

silicone, 适合用在厨房和浴室, 是elastic的, 很容易拆掉.

曾经唯一

曾经的我, 把妻子看作是整个世界. 现在妻子提出离婚,曾经唯一的歌词写得简直就是我当下的感受.

  《曾经唯一》歌词

歌手:李若溪

作曲 : 王宗贤

作词 : 任盈洁

你的笑,是我眼中幸福的唯一形状

你的目光,是我抬头仰望的唯一阳光

曾经我追随你目光

依你为方向

你的所有赋予我存在的荣光

而今你眺望向远方

选择了遗忘

我该驶向何方

探讨: 和妈妈对话

上个星期日, 我妈和我视频聊天的时候说她想以后暑假寒假来欧洲玩. 我说别呆太长时间, 最多一个月, 不然会影响我的生活.

我觉得这样说是错的.

因为妈听了这话会感觉我嫌弃她. 她会觉得以前自己花了那么多的精力, 付出那么多爱把我养大, 现在儿子却不愿意和她在一起住.

但是我应该怎么说呢? 像很多年轻人一样, 和父母住在一起我感到约束, 每次出去和朋友们玩, 都不免要先和妈妈打好招呼, 还免不了应付她的盘问.

好的办法可以欢迎妈妈来, 但是定好一起生活时的规矩. 我打算这个星期先承认错误再和她探讨一下怎么做更好.

驾驶课复习

7月7日和Daniel学开车. 从bio c’est bon往la croix de berny开, 第一个右边有两条路的地方右转去fresnes方向. 首先遇到了那条经典的stop.

1. 车靠右开. 这次是daniel负责停的, 按他的理论车右边没有车道, 汽车靠右行驶, 转弯是个钝角他停的时候车头略微向右.

2. 眼睛看哪里. 车正常行驶的时候, 眼睛向前看, 看后视镜, 扫仪表盘. 眼睛不停地在这几个地方看. 向右转或者换到右边车道时, 多次看右手边反光镜, 看configuration. 发现没问题了, 打灯, 看死角. 变道或者转弯. 转弯之前眼睛必须看的前边的人行道两边, 如有行人, 转过弯准备立刻停车.

3. 看左右手反光镜时候怎么看? 看好几眼. 看汽车的速度, 距离. 判断能不能变道或者转弯.

4. 死角怎么看. 死角在左右两侧前后车门之间的位置. 看的时候转头就够了. 不用身体离开座位.

讲完了都改看什么之后. 我们去orly piste练习加速, 减速. 减速还是掌握不好时机. 高速路上减速的时候一定要注意后面汽车, 不能减速太突然. 放置后面的车追尾. 减速换挡的时候离合保持在point de patinage一瞬间. 车就不会突然抖一下了.

倒车. 右手扶着副驾座位. 眼睛向后看. 开的时候眼睛顾着前视镜看汽车前边的情况, 右手反光镜注意和trottoir的距离. 开的时候速度不要快, 但是尽量要稳.

demi tour, 汽车先向左边前进, 再向右后退, 再想做前进. 进行manoeuvre的时候, 我优先级最低, 周围人要做什么都要给他们留地方. 整个操作过程, 只用离合让汽车前进, 速度要慢. 向左前进时, 眼睛看着左前轮的位置. 向右倒退时, 头朝后, 眼睛看右前轮.

不足. 首先是减速. 从90到30的这个过程一直都不顺, 掌握不好减速的节奏. 在rond point里面保持速度平稳. 我只要一看右边或者左边, 车速就会降低. 必须学会的是脚自动控制好车速, 眼睛还要看”四面八方”.

星期六和Christine学车. 开的还可以. 有时候起步有点太猛. 减速带上面注意车速不能太快, 保持一个慢速.

思维方式杂记(二)

  1. 先吃苦后享受.
  2. 活在当下.
  3. 成熟的人看利弊, 幼稚的人看对错.
  4. 人生本来就有喜怒哀乐, 每个人要接受这个现实. 不能执拗地认为人生总该是 快乐的. 一不顺心就感叹上天不公.

上面这些观点都是思维的模式, 是老婆提出离家出走以后, 我读到想到的. 先吃苦后享受, 让我意识到在回家要先写作业再玩耍, 先做家务再休息, 先写日记再放松. 活在当下, 我只听到一个词, 感觉是个思考的系统, 以后我再补充细节. 成熟的人看利弊, 幼稚的人看对错. 这是说做决定的时候, 要从利弊的角度分析. 原文的例子: 要不要接收难民? 接收是对的, 难民那么可怜, 要有人道主义. 接收有利吗? 难民语言不通, 很难融入社会, 很可能带来社会不安定等问题. 所以不接收. 接受人生的喜怒哀乐, 无论在什么情况下, 都能以一颗平常心对待.

  1. 坚信自己是有价值的人, 就不允许自己自暴自弃, 就会积极主动地去迎接人生中的挑战.

老婆抛弃了我, 我不把自己当成一个人渣, 不去骚扰她, 不在办离婚手续的时候捣乱. 开始健身, 努力提高自己. 以后要过得更好.

发展事业, 格局必须要大, 如果我自甘一辈子做一位程序员, 那也无可厚非. 但是我的欲望远远超越这个目标, 为了填满我的欲望, 我必须有远大的目标, 为了实现它奋斗终生. 我要做自己的老板, 开自己的公司, 实现财务自由, 建立和睦美满的家庭, 生很多孩子!

关于活在当下.

说法很多, 简单地有好好享受过程. 饥来吃饭困来眠. 最怕的是吃饭时千般思索, 睡觉时万般思量.
另外的有人讲:  “当下”是什么,一般人的理解是“真正的现在”,而“现在”是一个时间用语,把“当下”当作时间的时候很少。“当下”并非是时间,带有时间的成份,说它是个境界较为接近。在日常生活中的“当下”带有“现在”的意思,如:当下正在走路,要一心走路,把走路当成“当下”来对待,此时的心就是走路,离开走路的一切想,都要以观的形式让其所想的内容停下来。当所想的内容停下来时,就会出现一片空白的现象,这片空白什么都没有,就连自己存在不存在都没有。此时有个 “知”在,知道空空荡荡什么都没有,“知”就是个“观”, “知”就成为观察者、旁观者。这个什么都没有的状态就是“当下”。- 这个说法提供了一个活在当下的解释, 就是有个旁观者的角色, 这个旁观者可以让心停止所想的内容, 出现一片空白. 而心中一片空白的境界就是”当下”.

活在当下可以帮助我专心工作, 治疗拖延症. 但是也未必是好事. “阿基米德浴缸里看清迷途,凯库尔梦中醒悟结构式,不都是不甘活在当下的典型么? 说到这里我自己都懵了,你到底要活在哪里?是生活在别处,还是活在当下?”

天涯高人说很多事情都是”五谷轮回”, 能进能出, 能收能放, 能工作能享受, 能赚钱能消费, 能聆听能创见, 能爱能被爱, 能活在当下能游转得出.