ES6之路之块级作用域

作用域 作用域指变量所作用的范围,在 Javascript 中有两种作用域: 全局作用域 函数作用域 变量提升 变量提升(Hoisting)被认为是, Javascript 中执行上下文 (特别是创建和执行阶段)工作方式的一种认识。具体表现就是所有通过 var 声明的变量会提升到当前作用域的最前面。 function foo() { console.log(temp); } function bar() { console.log(temp); var temp; } foo(); // ReferenceError: temp is not defined bar(); // undefined 可以看到用 var 声明了的并不会报错。因为其实函数 bar 等同于 function bar() { var temp; console.log(temp); } 大多数类 C 语言语法的语言都拥有块级作用域。在一个代码块(括在一对花括号中的一组语句)中定义的所有变量在代码块的外部是不可见的。定义在代码块中的变量在代码块被执行结束后会变释放掉。这是件好事。 糟糕的是,尽管 Javascript 的代码貌似支持块级作用域,但实际上 Javascript 并不支持(就是因为有变量提升)。这个混淆之处可能成为错误之源。 所以在 ES6 中规定了 let 和 const 来支持块级作用域。但是,是不是真的提升就不存在了呢,可以看下面暂时性死区这部分。 let let 可以理解为『更完美的 var』,使用方法很简单; let foo = 3; 使用方法基本和 var 相同,而且声明的变量只在其块和子块中可用,这点也与 var 相同。 二者之间最主要的区别在于 var 声明的变量的作用域是整个封闭函数。...

April 19, 2018 · 3 min · 495 words · 桃翁

你不知道的黑客

前言 我相信大家对于『黑客』这个词并不陌生,特别是对我们搞计算机的人来说,那是相当的熟悉。 在一般人的眼里『黑客』(hacker)就是入侵计算机的人,就是『计算机犯罪』的同义词。但是,它的原意并非如此。 起源 在 20 世纪 60 年代初,麻省理工学院有一个学生团体叫做『铁路模型技术俱乐部』,他们把难题的解决方法称为 hack。 这里,hack作为名词有两个意思,既可以指很巧妙或很便捷的解决方法,也可以指比较笨拙、不那么优雅的解决方法。两者都能称为hack,不同的是,前者是漂亮的解决方法(cool hack 或 neat hack),后者是丑陋的解决方法(ugly hack 或 quick hack)。hack 的字典解释是砍(木头),在这些学生看来,解决一个计算机难题就好像砍倒一棵大树。那么相应地,完成这种 hack 的过程就被称为 hacking,而从事 hacking 的人就是 hacker,也就是黑客。 所以在 20 世纪 60 年代,『黑客』这个词是一种能力的象征,而且自称黑客的人他们比如包含着高度的革新、独树一帜的风格、精湛的技艺,也就是说在其他人的眼中,他们就是大佬。 自由软件基金会创始人理查德·斯托尔曼认为黑客的行为必须同时满足,好玩、高智商、探索精神三个特点才是真正的黑客。这也是黑客所追求的三种价值,而不是实用性或金钱。 从这个意思出发,我们有时也会用到这个,比如我平时在实现某一个功能的时候,用常规的方法解决不了(或者说当时想不到科学的解决方法),用了一半不是那么科学的方法(或者不知道为什么这种方法就可以解决这个问题)的时候,我们也许会说我们用了一种 hack 的方式来解决了这个问题,并且会在这个方法写上一个注释标识是 hack,因为有可能其他人不知道为什么要这么用。 黑客精神 在史蒂文·利维出版的黑客著作 —- 《黑客:计算机革命的英雄》中,将黑客的价值观总结为六条『黑客伦理』: 使用计算机以及所有有助于了解这个世界本质的食物都不应该收到任何限制。任何事情都应该亲手尝试。 信息应该全部免费 不信任权威,提倡去中心化 判断一名黑客的水平应该看他的技术能力,而不是看他的学历、年龄或地位等其他标准 你可以用计算机创造美和艺术 计算机使生活更美好 根据这六条『黑客理论』,黑客价值的核心原则可以概括为:分享、开放、民主、计算机的自由使用、进步。 历史上一些最优秀的程序员都是『黑客』。包括 Unix 创始人丹尼斯·里奇和肯·汤普森,Linux 创始人莱纳斯·托瓦兹,『开源运动』创始人埃里克·雷蒙德,微软公司创始人比尔·盖茨等等。正式黑客把计算机推向了更高的高度。 『黑客』被误解的原因 根据『黑客伦理』,黑客就是不服从管教,具有叛逆精神,根据史蒂文·利维描述的就是:“对于黑客来说,关着门就是一种挑衅,而锁着门就是一种侮辱。 ······ 黑客相信,只有有助于改进现状、探索未知,人们就应该被允许自由地使用各种工具和信息。当一个黑客需要一样东西来帮助自己创造、探索或者改正某种设备时,他不会自找麻烦,不会接受那些财产专有权的荒谬概念。” 他们侵入计算机系统的原因不是为了自己利益,而是为了自由,跟那些计算机罪犯是不同的。 然而,在 20 世纪 80年代初,一帮青少年黑客入侵了美国和加拿大的一些计算机系统,被《新闻周刊》封面报道的标题就是『小心:黑客在行动』,这件事被广泛报道,在报道时媒体就把黑客的行为注意在一个很窄的方面:入侵系统。同时,那些入侵计算机的程序员也自称『黑客』,从此黑客在大众心中就成了有害人群。 结语 真正的黑客致力于改变世界,让世界运转得更好。 我们把传统意义上的黑客称之为 hacker,而那些而已入侵计算机系统的人应该称为 cracker(入侵者)。 作为程序员的我们都应该以传统意义的黑客为目标努力,也许你就是下一个黑客,下一个改变世界的人。 整篇文章大部分内容来自于《黑客与画家》,可以推荐给大家都去看下这本书,感受一下那个时代正真的黑客精神。 ** 最后,大家可以在评论里面留言,你心目中最伟大的黑客都有谁。** 大家好,我是桃翁,我为自己代言!...

April 13, 2018 · 1 min · 71 words · 桃翁

像素相关概念:PPI、DPI、设备像素、独立像素

欢迎访问我的个人站点 前言 我相信对于像素,英文「pixel」,缩写「px」,这个概念并不陌生吧,不管是设计师设计图片用的单位 px,还是前端工程师在 css 里面的单位 px等等,很多领域都会用到这个单位,但是当我问他们一些问题的时候,基本上都答得不好。 比如: iPhone 6 的分辨率是 750 x 1334 像素,然而我们我们在写 css 的时候是以 375 x 667 来调的; 为什么我们做的一个网页在 pc 端可以正常显示,在移动端也可以正常显示,但是有时候又不正常显示; 我们如果在 pc 端把浏览器的宽度调到只有 200px 宽,里面写一个 100px 宽的 div ,然后再调整浏览器的放大为 200%,然后这个 div 可以充满整个显示器。 如果都能答上来,已经很不错了哦! 像素 定义:是指在由一个数字序列表示的图像中的一个最小单位,称为像素。 —- 百度百科 注意: 我觉得这里最关键的是『单位』,像素是一个单位,而不是一个点,我认为理解为一个长度单位比较好理解,后面我会解释为什么我会觉得是一个长度单位比较好理解。 我在很多文章里看到的定义是,像素就是组成图像的一个一个的点,这会让人感觉像素是个面积单位,我觉得这样有点不妥,并不是不对,要根据上下文而定。 比如 设备像素比(device pixels ratio),简称 DPR,DPR = 设备像素 / 设备独立像素。现在我们就拿 iPhone 6 来做例子,我们可以通过 window.devicePixelRatio 获取设备的 DPR 为 2,设备独立像素,在这里可以认为是 css 像素,整个 iPhone 6 的像素点就有 375 * 667 个。...

March 30, 2018 · 2 min · 338 words · 桃翁

如何将多个 maven 项目统一管理

简介 在我们一个人采用微服务构架的时候,我们会创建很多个 maven 项目。然后如果从 IDE 里面导入项目就要导入很多次,为了方便统一管理,我们可以将多个 maven 放在一个 项目里统一管理,然后我们导入项目的时候就可以直接导入一个项目就 OK。 操作方法 在多个项目的父目录建立一个文件夹,创建一个 pox.xml 文件 代码规则 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001-XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.lxr</groupId> <artifactId>maiba_be</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- packaging 把 jar 改成 pox --> <packaging>pom</packaging> <!-- 这里面放每个微服务的 artifactId--> <modules> <module>goodsService</module> </modules> <!-- 为了解决依赖版本问题 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Camden.SR3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.2.RELEASE</version> </parent> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> 每个微服务项目的 pox....

March 22, 2018 · 1 min · 122 words · 桃翁

vim 入门指南

个人站点:桃园 0. 前言 0.1 简介 vim 被誉为『编辑器之神』,与之同时代的 emacs 被誉为『神之编辑器』。可以看得出 vim 在编辑器的地位是很高的,得益于 vim 的指法,敲起代码来如行云流水。特别膜拜创始人创始出这么方便的敲代码的指法,这篇文章就是来带你入坑 vim 指法操作。 0.2 前端的我为什么要学习 vim 在当今前端开发工具百花齐放的时代(VS Code、Sublime、Atom 以及 IDE Webstorm),我为什么还要介绍 20 多年前开发的一个老古董呢?在这里我想说的是出身虽然老,但是所带来的价值并没有减,一旦习惯了 vim 的指法之后,你会觉得不用 vim 操作写代码会觉得很不习惯,甚至不知道怎么操作。然而用在支持 vim 指法的编辑上写代码你会觉得如行云流水,如果再配个机械键盘,简直是享受,特别符合极客的风格。 一旦学会了 vim 的指法,会让你终身受益,至少在你敲代码的年代会收益,毫无夸张, 它会让你摆脱烦人的,在敲代码的时候频繁的移动鼠标,这也是 vim 的设计理念之一 – 脱离鼠标。 0.3 文章适用读者 本篇文章比较适合前端开发者,因为我也只是用 vim 在前端领域做过一些开发,其他领域我没有发言权。 0.4 Q&A Q:你推荐 vim 是要我们完全放弃以前的编辑器而投入 vim 的怀抱吗? A:当然不是。首先 vim 的学习成本还是很高的,因为他跟平时我们用的编辑器敲代码的方式根本不同,因为它是不用鼠标的,纯键盘操作。你想想如果你在你的 vs code 上不用鼠标操作,你上下左右全靠方向键,那敲代码的速度得有多慢。而且初学者想把 vim 打造成一个自己的 IDE 还是很有难度的。所以我这里推荐的是,不管是你的 vs code、sublime等,装一个 vim 插件。我在 vs code 上试过,很爽,只不过现在投身到 emacs 的怀抱了。...

March 20, 2018 · 2 min · 351 words · 桃翁