《JavaScript权威指南》读书笔记: 闭包

闭包,简单说是指: 函数对象本身和这个函数关联的作用域链的结合

上面的定义可能听不懂,为了详细说明这个概念,需要先解释清楚JavaScript中作用域相关的概念。

变量作用域

变量作用域是一个变量在定义后在源码中可见的范围。

JavaScript中存在两种变量作用域:

全局作用域:全局变量具有全局作用域,在整个JavaScript代码中都可见

本地作用域:

  • 在函数中定义的变量就是本地变量,这些变量具有本地作用域,他们在其被定义的函数体内部完全可见,函数的参数也算作该函数的本地变量。
  • 本地变量可以覆盖同名的全局变量
  • 函数可以嵌套,且每一个函数都具有自己的本地作用域环境。

例子:

函数作用域

JavaScript使用函数作用域规则来决定变量的作用域范围。这意味着,一个在函数中被定义的变量,在这个函数体中,以及该函数体中嵌套定义的所有函数内部都可见。另外和同名本地变量覆盖全局变量同理,嵌套函数中的同名本地变量也会覆盖其上层函数中的本地变量。

例子:

作为对象属性的变量

变量的本质是通过对象来组织到一起的属性集合。

当你定义了一个全局变量,你是在全局对象上定义了一个属性(这个全局对象根据宿主环境不一样而不一样,比如在浏览器里面就是window)

对于本地变量,你可以同样的将他们视为某个对象的属性,只是在JavaScript中,你并没有方法获取到这个对象。在ES3中,这个对象被称为“调用对象”(Call Object),在ES5中被称为“声明上下文”(declarative enviroment record),以下面这个函数定义为例:

若我们能找到办法获取到这个“调用对象”的对象引用,即为A,则A将具有如下的属性:

作用域链

结合上面的所有信息,在JS的实际执行中,为了准确的定位到一个标示符具体指向的是哪个变量,我们需要了解作用域链的概念。为什么需要这个听起来很复杂的东西?先看看下面的代码:

这个例子其实不算复杂,但是你在看的时候还是要仔细注意这些个namemyNameoriginName 都实际指向的是哪个变量。

首先作用域链是什么呢?JavaScript中的每一块代码都会与一个作用域链相关联,这个链是一个对象列表,对于每一个标示符,都依次从这个链的对象中查找具有同样标示符的属性。而作用域链就是由全局变量和不定数量的由函数调用产生的调用对象构成的列表。

看下面的例子:

需要注意,在一个函数刚刚被定义时,还没有调用对象存在,只有当这个函数开始被调用执行时,才会有一个调用对象被创建用于储存其中的本地变量。也就是说,相同的一个函数,在每一次调用都会产生一个独立的调用对象。

另外,在函数刚刚被定义时,除了新建了一个函数对象(Function Object)外,还将当前的作用域链和这个函数对象关联在了一起:

所以当函数嵌套很多的时候,作用域链会很长:

词法作用域

词法作用域(lexical scoping)是指,函数在执行时,使用的是它被定义时的作用域,而不是这个函数被调用时的作用域。

有点抽象,我们看下面的例子:

上面的例子中,核心是嵌套定义的这个函数:

虽然实际该函数在执行时fn()时作用域中的scopeglobal scope,但是实际执行使用的是定义函数时的那个 ‘local scope’,集合上面作用域链的知识,所谓的词法作用域规定了:

函数在执行时使用的作用域链是它在定义时绑定的那个作用域链(准确地说是使用当时绑定的那个作用域链加上新建的调用对象组成的新的作用域链),而不是函数调用时所处上下文的作用域链。

回到闭包上来

上面讲了这么多概念后,回到一开始的答案:

函数对象本身和这个函数关联的作用域链的结合。

也即是:fn + fn.__scope_chain (并不存在__scope_chain,只是为了让这个关联更加形象)

其实,由于作用域链本身的特性,以及函数在定义时就能和作用域链关联起来的自然特性,可以简单说:在JavaScript中,每个函数都是闭包。

理解了闭包本身后,你会发现,闭包的强大之处其实在于:JavaScript中的函数,通过作用域链和词法作用域两者的特性,将该函数定义时的所处的作用域中的相关函数进行了捕获和保存,从而可以在完全不同的上下文中进行引用。

《奇幻森林》观后感

p2324177434

今天下午一个人去看了IMAX,随便说点印象。

CG技术再一次刷新

我对于动物渲染的印象,还停留在大家称赞少年派中的老虎多逼真时,《奇幻森林》已经表示群兽共舞已无压力。印象特别深刻的是毛克利坐在巴鲁肚子上在水里戏水那段…真人和特效中的熊以及水的所有融合,如此自然:

Continue reading →

第一次约拍有感:尊重

第一次约妹子拍照,高中同学,前室友,关系非常好的闺蜜。

约在公园旁边的星巴克见面。我是想,在开始前,两个人先熟络熟络,免得一下开拍要尴尬。妹子先到,给我点了杯红茶拿铁,我们坐在门口靠窗的位置,聊了大概20来分种起身向公园逛去。

这次拍摄对于我而言,心里是没有底的。一来没有经验,二来环境我也不熟悉,三来我也并不知道该用哪些取景比较好。不过好在和妹子相熟,也算是互相理解,还算轻松自在。

走到河边的栏杆边上,我决定就从这里开始,让妹子靠着护栏随便拍了几张,拍完妹子就凑近想看效果,我点开相机预览,画面一片曝光过度的白,尴尬。我冷静了一下,想起昨晚在调整iSO最大值时似乎忘了调整回来,一看果然是,调整回来继续拍了几张,终于正常。

因为公园人太多,就没有直接进公园,发现公园的外围有个小楼,廖无人烟的样子,我俩便进了去,如果不算这阴沉的天气,也算凑合可以用。

在来拍照之前,我其实已经在图虫上看了很多妹子的人像摄影作品,所以实际在拍时,也是多有模仿。我把手机里的一些作品给妹子看,没有太多被拍经验的妹子也是感叹,这些神情和动作看似简单,却并不容易做到。因此本次拍摄的很多表情,多少有点矫揉造作不自然,反而损失了妹子本身的自然性情,也是遗憾。

人像摄影的一大拍法,就是背景的大虚化,可惜我的光圈1.8的定焦镜头却被我无心留在了杭州,手上的套头虽然焦段长光圈只到4.0,还是差一点。实际拍摄的时候,为了得到大的景深效果,只能拉长焦,站在远处拍近身。现在回想起这一点,其实在人像摄影中并不合适,因为随着焦段的变大,画面会被拉宽,人会显胖。

在小楼这边拍了很多张,随后进了公园,逛了半天终于发现一片没什么人的小树林,正巧也是到了下午快4点的时间,太阳从云层中透出,借着横向过来的柔光,让妹子靠着树拍了好多张。

中间有一回,阴了好久,太阳突然出来,妹子喊我快拍,我猛按快门,却不听声响,浪费了妹子好些表情,甚是尴尬。低头检查,相机显示FULL,存储卡居然已经占满。才想起之前某日在摆弄相机设置,开了raw+jpg格式的质量,加上我存储卡本来就不大,这么快用完也并不奇怪了。于是只好和妹子一起删去了大部分明显不佳的照片,降低了图像的存储质量,才能勉强继续拍。

大约拍到4点多,由于存储卡实在没法继续拍以及我俩也累了,就结束了拍摄。


由于手上还有其他事情要处理,真正开始修图,是拍摄完的第三天晚上。

第一次用Lightroom,对于软件的使用并不熟悉,加上可以调整的参数比之手机上的软件,复杂太多,因此也是调了好久才开始有感觉。除去各种参数不谈,LR最方便的自然是预设的自定义。修到后来,我基本上是按照拍摄场景保存预设,比如“妹子 走廊”一个预设,“妹子 草坪”一个预设。

用LR调色后,下一步是用PS进行皮肤,脸型等的优化。在这一步上我是并不擅长的,而且一方面是懈怠,另一方是内心排斥这样的人为加工。但还是硬着头皮修眼袋,修瑕疵,凌晨快2点左右才整体弄完。

为每个场景都选了一些做了长图。没给妹子过目,就急忙发了朋友圈。


我时常也是一个无法推迟自己满足感的人。拍完妹子的这两天我就一直在想着赶紧修完,发给大家看,得到大家的赞赏。这种心态我虽然深知,却还是无法自制。

记得之前在某个群里跟朋友讨论过,过度的关注别人在表面的认同,会偏移你对事物的关注点。以摄影这件事情来说,通过别人的点赞来获得认同以及得到动力本身是可怕的。我一直在反思这种心态。

照片发出去后,大部分自然是好评,负面评价也有,重点是妹子本人并不喜欢。后来妹子拿了我所有的原图后,自己挑选了几张,自己修过重新发了朋友圈。对我是一份打击。

早上从起床开始到穿好衣服下楼准备洗漱心里都在想着这件事情,于是微信妹子,关于这件事情很坦诚的跟她聊了一下。

毕竟大家都很熟,妹子也很直白的表达了她的看法:

每个人观看照片的角度会不一样。女生嘛,还是希望自己在照片里看起来美美的,如果达不到自己的预期,即使景再美,也会放弃这张照片。

她觉得我比较注重照片的写实效果,但是不够关注人本身在照片中是否漂亮(比如脸型,身材)等。她说的问题,其实我自己已经意识到了。我跟她道了歉,表明最大的问题,还是在于没有尊重她对照片的看法,以及没有充分的沟通。

我觉得,人像摄影这种东西,当要公布在大众视野中时,便已经不再是摄影师私人的东西了,这份影像,关乎到被拍摄对象留给公众的印象,这一点,是必须明确的。

后来妹子也说了一些别的想法,觉得“我很勇敢,能接受真实的自己,但她尚无法坦然面对,过不了自己的心理障碍”,我能充分理解,毕竟,大部分人都是如此啊。

她跟我表达这个想法的时候我觉得挺难过,觉得因为我的摄影给她造成了这样一种消极的情绪,很是过意不去。但是非常感谢她的坦诚,让我在对她人尊重方面又上了一课,以及更加了解妹子们的心理诉求。


最后还是做一下总结,希望下一次做的更好:

  • 事先能对拍摄场景有一定的了解,事前先有一个大体的构想
  • 事先的沟通,了解被摄影对象的诉求
  • 存储卡充足。(已经买了两张64GSD卡)
  • 学会 “拍小拍瘦” 这样的基本技术
  • 避免用长焦拍人
  • 修图的顺序,目前我觉得应该是:先自己LR修一轮,给妹子看过,调整后确定色调。然后让妹子精选一定数量进行精修,明确妹子的修图诉求,交付给妹子。得到同意后对外发布。这里其实整个后期非常耗时,但好事总要多磨。
  • 修皮肤和修脸型什么的需要再学习一下