不合常理的变量提升

变量提升

合乎常理的预期

按照合乎常理的预期,程序应该是由上至下一行一行执行的,如果使用了之前没有定义的变量的话,正确的反应应该是会报错,就象下面这段 C++ 代码:

#include <cstdio>
using namespace std;
int main() {
printf("%d\n", &n); // Error
int n = 2;
}

事件流:冒泡与捕获

事件流

事件流描述的是从页面中接收事件的顺序。在 JavaScript 中事件流有两种,一种是由 IE 开发团队提出的事件冒泡流,而另一种是 Netscape 提出的事件捕获流。

事件冒泡

事件冒泡流,即事件开始时由具体的元素接收,然后逐级向上传播,直到 document 对象。

<div>
<p> Click </p>
</div>

作用域与闭包

作用域

在 JavaScript 中变量的作用域与其他语言不同,JavaScript 的作用域不是由 {} 来界定,而是函数。所以循环实际上是在全局作用域中。

for(var i = 0; i < 10; i++) {}
console.log(i); // 10

全局变量 & 局部变量

JavaScript 变量的作用域分为两种,全局和局部。

在 JavaScript 中声明全局变量有两种方式,一种是在全局环境下使用 var 声明,另一种是在任何地方直接初始化变量,那么它将会是全局变量。

开始记录

欣喜

这两天迎来了 Hexo 博客主题 even 真正意义上的第一个用户 Leyar ,第一次可以看到博客主题别人用上的效果。

虽然主题还有很多问题存在,但我会慢慢去完善它。期待越来越多的用户~

奇怪的原型链

在 JavaScript 中一切皆为对象(Object),但是却与 Java,C++ 等语言不同,没有“类”的概念,也没有所谓的“子类”和“父类”。JavaScript 中的对象是基于原型(prototype)来实现面向对象的,靠奇怪的原型链(prototype chain)来实现继承。

对象与原型

在 JavaScript 中创建对象使用 new 关键字,而后跟着的是构造函数。在 JavaScript 中没有类的概念,所以对象的构造函数就是单纯只是个函数(function)。

apply, call 与 bind 的区别

最近在看 《JavaScript 高级程序设计》,也就是所谓的高程3。正好看到 Function 部分,看到了几个熟悉的字眼,apply()call()bind()。好像是有些面试题里面有,遂搞清楚了记录下。

apply() 与 call()

每个函数都包含两个非继承的方法:apply()call()。两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内 this 对象的值。这是书中的说法,大概意思就是 apply()call() 这两个方法是用来改变函数中 this 的指向的。而 apply()call() 的区别就在与接收参数的方式。

apply() 方法接收两个参数,一个是在其中运行函数的作用域,函数中的 this 的值,另一个是参数数组。
call() 方法的第一个参数跟 apply() 相同,不同的是除了第一个参数,后面的其他参数将会直接传递给函数。

Jade 模板引擎

最近在改一个 Hexo 的主题 apollo。然后看到这个主题用的是叫做 Jade 的模版引擎写的。之前了解过几个模版引擎 ejs,swig 什么的,但是这些都是在原有的 HTML 中插标签,看起来有点乱。看到 Jade 后就深深的被它那如同 Python 的缩进语法深深吸引了,遂上网学习一发。

Jade 是 JavaScript 实现的,供 Node 使用,原生支持 Express。但也有 PHP,Python 等其他语言的实现。(要是 HTML 模版用 Jade,CSS 用 Styl,后端用 Python,那岂不是很好玩~全是缩进缩进缩进=。=)

DOCTYPE

添加文档类型可以通过 !!! 或者 doctype 来添加。

Python 多线程初步了解

这两天在写 Nada 的下载功能,遇到一个问题,在下载歌曲的时候整个界面都会卡住,必须等待下载完成才能够恢复,因为写的时候是直接顺序执行的,没有多线程。之前在写播放功能的时候是参考了别人的代码,自己其实对多线程部分不是很了解。然后趁着晚上了解一下 Python 的 thread 和 treading 模块。

Python 多线程支持

Pyhton 标准库提供了 thread 和 threading 模块来支持多线程,这意味着不需要重新下载这两个模块,只需要在代码中 import 这两个模块就可以了。

thread 模块

thread 模块是以低级、原始的方式来处理和控制线程,提供了一个简单的锁(相对于 threading 模块的锁的感觉来说的确是比较简单)。相对于 threading 模块来说,thread 模块更加灵活。

Python curses 模块

Python 中的 curses 模块封装了 C 语言的 curses。curses 是一个能够提供基于文本终端窗口功能的动态库。它可以创建和管理一个窗口,使用8中不同的颜色,提供鼠标以及键盘支持。与 Tkinter 不同的是 curses 是基于终端的。

curses 支持 Unix/Linux 系统,目前不支持 Windows

2015 总结

记录 2015,计划 2016

关于生活

对2015 年的春节并没什么印象,现在也想不起来那时候在做什么了。大概是在游戏中度日吧,回想那段日子,现在还真是觉得那时候在浪费时间呢。

接着呢就是大一的第二个学期的到来。数据结构,对这门课还挺感兴趣呢,学起来也觉得还 ok。大概在 3 月,被老师推荐去了学校刚刚开始搞得 ACM 集训队。开始重新看起了 C,但是依旧还是会沉浸在游戏中。

就这样在做题,训练与游戏中到了五一。回家之后不知道是那根筋不对,开始对 Linux 感兴趣了,把电脑上的游戏删了,把系统换成了 Ubuntu。假期期间换了无数 Linux 发行版,也开始慢慢了解开源。于是,我开始玩起了 Ubuntu。假期结束接着的是 ACM 的各种比赛,去了广州的各大高校,参加了在中大举办的广东省程序设计比赛,打了打酱油。看到了很多虽然同是大一的大牛,差距是那么的大。

就这样我又默默的水过了一个学期,唯一值得纪念的就是去了中大打了酱油吧。

大二。刚开始对课程里的人机交互还是充满期待的,但是后面我发现我错了,这只是一门网页设计与推广某个所谓创业平台的课。所以说,像这样的大学,虽然也不乏良师,但大部分还是靠的自学。