Blog
Blog copied to clipboard
冴羽写博客的地方,预计写四个系列:JavaScript深入系列、JavaScript专题系列、ES6系列、React系列。
## 前言 在[《JavaScript深入之执行上下文栈》](https://github.com/mqyqingfeng/Blog/issues/4)中讲到,当JavaScript代码执行一段可执行代码(executable code)时,会创建对应的执行上下文(execution context)。 对于每个执行上下文,都有三个重要属性: * 变量对象(Variable object,VO) * 作用域链(Scope chain) * this 今天重点讲讲作用域链。 ## 作用域链 在[《JavaScript深入之变量对象》](https://github.com/mqyqingfeng/Blog/issues/5)中讲到,当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找,一直找到全局上下文的变量对象,也就是全局对象。这样由多个执行上下文的变量对象构成的链表就叫做作用域链。 下面,让我们以一个函数的创建和激活两个时期来讲解作用域链是如何创建和变化的。 ## 函数创建 在[《JavaScript深入之词法作用域和动态作用域》](https://github.com/mqyqingfeng/Blog/issues/3)中讲到,函数的作用域在函数定义的时候就决定了。 这是因为函数有一个内部属性 [[scope]],当函数创建的时候,就会保存所有父变量对象到其中,你可以理解 [[scope]] 就是所有父变量对象的层级链,但是注意:[[scope]] 并不代表完整的作用域链! 举个例子: ```js function...
```javascript function f(x) { console.log(x) // 5 var x console.log(x) // 5 } console.dir(f) f(5) ``` 其实这个如果形参和声明的变量重复的话,按照输出的意思是 ```js VO:{ arguments:{ '0': x }, x } ``` 然后变量x的声明是将形参的声明覆盖了然后传递参数将其赋值为5的吗? 可能没描述清楚问题,大概意思就是变量的声明同名情况下与形参的关系。 谢谢
## 前言 在翻译完 TypeScript 官方文档后,我用 VuePress 搭建博客,又实现了 GitHub 和 Gitee Pages 的自动部署,但我最终还是决定自己建站,而在建站的过程中,必不可少会用到 Linux 命令,所以此篇写一份基本够用的 Linux 命令,会涵盖博客搭建系列文章用到的各种命令,方便查询和学习使用。 ## 0. Owner、Group、Others、Root Linux 系统是一种多用户系统,它将文件访问者身份分为三种: ### 文件所有者(Owner) 当创建一个用户的时候,Linux 会为该用户创建一个主目录,路径为 `/home/`,我们可以使用 `cd ~`,快捷进入主目录。如果你想放一个私密文件,就可以放在自己的主目录里,然后设置只能自己查看。 ### 群组(Group)...
- bug率高 - 不懂业务逻辑 - 还原度不高
## 前言 最近我发起了[「冴羽答读者问」](https://www.yuque.com/yayu/ask/dzng83 "「冴羽答读者问」")活动,如果你也有想要提问的问题,欢迎留言,我会按照顺序依此回答。 ## 正文 这个问题我们就聊聊“如何提问”好了。 回答这个问题,自我感觉有些班门弄斧,因为我并不是一个擅长提问的人,所以我就从日常的工作生活中,分享一点自己的看法好了。 提问的场景有很多,先说工作中。 我们的老板常会告诉我们一件事情,简略的描述后就让我们去做,我们可能因为各种原因没有细问就直接去做了,最后做出来的东西与老板想要的东西差别很大,又陷入返工之中。 这就是因为在揽下事情的时候没有明确思路,以至于跟老板真正的想法对不上,为了避免返工之类的麻烦,你当时就应该细致的询问一遍,但具体要问哪些内容呢? 这里可以参考领域场景分析的 6W 模型,即描写场景的过程必须包含 **Who,What,Why,Where,When 与hoW** 这六个要素。  所以对于一件事情,你可以问: 1. Who 面向的用户群体是谁? 1. When 什么时候要? 1. Where 发生场合在哪里? 1. What...
## 前言 TypeScript 的官方文档早已更新,但我能找到的中文文档都还停留在比较老的版本。所以对其中新增以及修订较多的章节进行了翻译整理。 我同时搭建了 TypeScript 中文站点: [https://ts.yayujs.com](https://ts.yayujs.com) ,正是因为我亲自翻译过,所以我认为这是国内最好的系统学习 TS 的教程之一。 本篇整理自 TypeScript Handbook 中 「[Generics](https://www.typescriptlang.org/docs/handbook/2/generics.html)」 章节。 欢迎围观[朋友圈](https://yayujs.com)、加入[低调务实优秀中国好青年](https://www.yuque.com/yayu/nice-people/xou8qr)前端社群,一个人走得快,一群人走得远。 ## 正文 软件工程的一个重要部分就是构建组件,组件不仅需要有定义良好和一致的 API,也需要是可复用的(reusable)。好的组件不仅能够兼容今天的数据类型,也能适用于未来可能出现的数据类型,这在构建大型软件系统时会给你最大的灵活度。 在比如 C# 和 Java 语言中,用来创建可复用组件的工具,我们称之为泛型(generics)。利用泛型,我们可以创建一个支持众多类型的组件,这让用户可以使用自己的类型消费(consume)这些组件。 ## Generics 初探(Hello...
## 前言 TypeScript 的官方文档早已更新,但我能找到的中文文档都还停留在比较老的版本。所以对其中新增以及修订较多的章节进行了翻译整理。 我同时搭建了 TypeScript 中文站点: [https://ts.yayujs.com](https://ts.yayujs.com) ,正是因为我亲自翻译过,所以我认为这是国内最好的系统学习 TS 的教程之一。 本篇整理自 TypeScript Handbook 中 「[Object Types](https://www.typescriptlang.org/docs/handbook/2/objects.html)」 章节。 欢迎围观[朋友圈](https://yayujs.com)、加入[低调务实优秀中国好青年](https://www.yuque.com/yayu/nice-people/xou8qr)前端社群,一个人走得快,一群人走得远。 ## 对象类型(Object types) 在 JavaScript 中,最基本的将数据成组和分发的方式就是通过对象。在 TypeScript 中,我们通过对象类型(object types)来描述对象。 对象类型可以是匿名的: ```typescript...
## 前言 最近我发起了[「冴羽答读者问」](https://www.yuque.com/yayu/ask/dzng83)活动,如果你也有想要提问的问题,欢迎留言,我会按照顺序依此回答。 ## 正文 如果只是抽象的回答这个问题,那毫无疑问是“成长”重要,因为我认为“成长”就意味着你有能力拿到更匹配的职位,拿到更高的薪酬,实现更自由的财务,否则你连这些也没有做到,“成长”不就只是一句美好的自我幻想吗? 不过让我们假设一个更加具体的场景来聊一下: > 毕业后就一直在这家公司工作,刚毕业的时候,总觉得成长最重要,现在都已经在这家公司工作 3 年了。 > > 这家公司感觉还不错,偶尔很忙,但大部分时间都能掌控,生活也能平衡得了,就是钱少了一点,而且还有点倒挂。现在有些迷茫,不知道钱和成长怎么选? 这个场景可能就符合更多人的困扰了。 说真的,工作生活能平衡就已经很好了。工作上偶尔有点忙,但大部分时间可控,给的钱也基本够用,生活中,还能跑跑步、散散心,周末出去玩耍,每年去旅游几次,想想也是很多人都羡慕的生活了。不过麻烦的地方就在于,快乐是有适应性的,而人性里,人是有追求不平凡的一面的,所以人总是会不自主的追求更多。 但我这样说,倒不是要劝说大家找到这样的环境,就认清现实好好过日子吧,我只是想说,这样的生活真的很好,所以有这样的生活的时候,好好珍惜,换了环境后,你很可能会怀念这样的生活。 说回这个问题,如果已经在一家公司工作 3 年了,除非工作职责发生了变化,否则该成长的我觉得应该已经成长的差不多了,无论是工作职责、还是技术架构、还是人际关系,应该都得心应手了,这个时候还能有什么多余的成长呢?人是会随着时间流逝有一些自然的能力增长,但如果还要有比较大的成长的话,更多要靠一些外力的因素,比如职责的变化、环境的变化等等。 所以在工作 3 年的时候,思考这个问题,与其说是一个在钱和成长之间选择的问题,我觉得背后更是一个“温水煮青蛙”如何破局的问题。也就是说,我对当下的环境还是比较满意的(已经是一个舒适区了),但我想要的更多的东西(这个例子中是钱,这个无可厚非),但又不想脱离这个舒适区,所以才会产生了迷茫。 那么这个问题该如何解决呢?就这个具体的问题而言,要不然忍受,要不然晋升,要不然跳槽。 无论是哪种,第一个要确定的问题都是,我还要在这家公司工作吗? 你可以问自己这个问题,“我愿意在这家公司再工作 5 年吗?”如果不能明确的给出肯定的答案,说明内心还是心有不甘,你迟早会离开这里的,只是缺少一个导火索而已。但就算是这样,也不代表着你当下应该离开这里,这只是注定了结局的走向而已。 然后才是应该思考晋升和跳槽,如果可以的话,优先选择晋升,倒不是因为这对你以后跳槽有帮助,而是工作了 3...
## 前言 仅看 cb 和 optimizeCb 两个函数的名字,你可能想不到这是用来做什么的,尽管你可能想到 cb 是 callback 的缩写。 如果直接讲解源码,你可能想不明白为什么要这么写,所以我们从 _.map 函数开始讲起。 ## _.map _.map 类似于 `Array.prototype.map`,但更加健壮和完善。我们看下 _.map 的源码: ```js // 简化过,这里仅假设 obj 是数组 _.map = function (obj,...
## 前言 最近我发起了[「冴羽答读者问」](https://www.yuque.com/yayu/ask/dzng83)活动,如果你也有想要提问的问题,欢迎留言,我会按照顺序依此回答。 ## 正文 简单的 6 个字,却流露出杠铃般的快乐,所以虽然不知道你想说什么,但是能肯定,你是一个很快乐的人。那这个回答,我们就聊聊,我对于快乐的一些看法好了。 根据一项研究,人类最常见的情绪是快乐、其次是爱和焦虑。但这并不是说,快乐是大部分时候的状态,对于正常人来说,大部分的状态还是不悲不喜,亦或者,不悲不喜偏快乐那么一点点,而在剩下的状态中,快乐的情绪虽然是很常见,但是又那么捉摸不透。 举个例子,这篇回答写于清明假期之前,知道假期快要到了,群里快乐的气息都要溢出来了,但真到了假期里的时候,相信大家发现也没有那么快乐,最后我们会发现,假期的快乐一半来自于想象和计划……那么,问题来了,你快乐的来源到底是什么呢?由哪些部分组成?这些组成一定要在假期这个情境下产生吗?如果快乐来自于想象,做白日梦不也是很快乐吗?每天都做白日梦,这是你想追求的快乐吗?你怎么确定在这份快乐之后,你不会后悔呢?你觉得快乐分低级和高级吗?…… 这些问题你可以觉得脑子一乱,然后粗暴的得出一个结论:“想那么多干嘛,想做就去做,哪管这么多!”将一个复杂的问题找一个简单的回答,确实能有效的减少人的心智负担,但这却无益于你的成长,只能凸显你思维的狭隘,你没有思考过那么多,自然想不到那么多。 当然了,可能在你思考绕了一大圈后发现,可能还真是这个结论,但从看山是山,到再一次的看山是山,你是要经历很长的路要走的,虽然结论可能还是那个结论,但因为你对其理解的深刻程度的改变,在面对相同的问题、相同的情景时,理解深刻的人可以做出更符合底层逻辑的判断和抉择,这往往就是我们常说的“成长”。 当然我写这篇回答,并不是要回答前面这些问题,我只是想表达,哪怕是快乐这看似很简单的情绪,其实背后也有着非常复杂的机制需要思考,不过我今天倒不是要聊这个机制,我想聊点其他的。 我们先从痛苦说起,毕竟我们追求快乐的目的,本质上还是希望我们的人生幸福一点,如果我们的痛苦能减少或者化解一点,亦或者自己的承受力更强一点,人生也是幸福了很多。 谈到痛苦,对我影响最深远的是艾克哈克托尔写的《当下的力量 2》,在大学的时候,我还将其完整的抄写了一遍,但和大家展开讲书中的内容,不免让这篇回答篇幅过长,所以我简要讲讲其中的内容。 作者开悟的起源在于持久性的焦虑状态之后,作者涌现的一个念头:“我活不下去了,我再也承受不了自己了”。正是这句话,让作者开始思考。因为在这句话里,“我再也承受不了我自己”中有两个“我”的存在,如果主体的“我”能感受到作为客体的思想、情感,那么两者不应该同为一物,所以在“我”和我受不了的那个“自己”中,哪一个是真我呢?由此作者展开了关于自我的思考。 我们将第一个“我”表达为“观察者”,第二个“我”表达为小我,正是来自于对虚幻自我以及外在形相世界的认同,再加上小我不停的对外界索取身份认同,形成了人类痛苦的根源,很多人如此认同于他们脑袋中的声音,和伴随那个不间断思想而来的情绪,以至于他们被小我的心智完全掌控着。 这也就是为什么我会在群里如此提倡“冥想”这个活动,冥想并不是神学,入门冥想也只用花费几个小时看本书比如[《十分钟冥想》](https://weread.qq.com/web/reader/f1e32af0719ecf67f1e2cbakc81322c012c81e728d9d180),或者在 B 站跟着视频教程学习实践,就比如[只有 8 集的 Headspace 正念冥想指南](https://www.bilibili.com/video/BV1Pf4y157pj?p=1)。 **我认为练习冥想有三个非常大的作用,第一个是能让你观察自己。** 因为冥想中的正念可以让你觉察到:我正在直接地与真实世界发生着互动,我知道我正在做某事,在思考某事。是我在想这件事,所以它出现在了我的脑子里。是我在观察,而不是我深陷其中。正念让我们有能力不被自己的情绪和想法劫持。一旦你能养成这种观察自我的习惯,就比如在你生气的时候,你能很快意识到,你正在生气,反而你能很快的调整好情绪,而不是一旦生气起来,就完全刹不住,直到自己把情绪完全发泄掉,伤害了别人后,才会开始回头反思。 **练习冥想第二个作用,就是养成顺其自然的心态。**冥想不是努力把阴云赶走,而是搬把椅子到花园里,坐看云卷云舒,面对脑海中的那些思绪,无论是否讨厌,无论是否喜欢,不强求、不抗拒、不挣扎,坦然的接受自己。 你说这有什么好处吗?其实细想我们的生活,我们往往会对很多事情,加入自我情感,就比如约会迟到了,有的人就会暴躁,你为什么要迟到?是不是不尊重我?你就是因为不重视我,所以才会迟到,你不重视我,就是不爱我了,不爱我了,又何必在一起呢?我们分手吧! 但是在这个例子里,我只是讲述了一个约会迟到的事实,仅此而已,为什么一定要加入那么多也许不是事实的想法呢?你都没有去核验那些想法是否真实,这样产生的想法又有什么意义呢?不过是徒增自己的烦恼和他人的伤害而已。也许事实是,因为路上帮助了别人所以迟到了。练习冥想,可以让我们学着接受事实,就仅仅是这个事实而,迟到了,花谢了,有人踩到你的脚了,失败了,放弃了……不延伸,不强求,不投入自我,不产生多余的情感,顺其自然,坦然接受事实,生活会轻松很多。...