IIssNan's Notes

Quick notes


  • 首页

  • 归档

  • 标签

  • 搜索

犀牛书中关于闭包的定义

发表于 2013-02-20 | | 阅读次数

Javascript函数是将要执行的代码以及执行这些代码的作用域构成的一个综合体。在计算机科学术语里,这种代码和作用域的综合体叫做闭包。所有的Javascript函数都是闭包。在上面讨论的那种情况,也就是说,当一个嵌套函数被导出到它所定义的作用域外时,这种闭包才是有趣的。当一个嵌套的函数以这种方式使用的时候,它常常明确的叫做一个闭包。

循环里的setTimeout

发表于 2013-02-08 | 分类于 技术水波文 | | 阅读次数

setTimeout函数的定义

Calls a function or executes a code snippet after a specified delay.
在指定的延迟后,执行代码/函数

setTimeout 函数接收两个参数,语法为:

1
timeoutID = setTimeout(func, delay);

第一个是将要执行的代码片段或者函数,第二个参数是延迟时间,单位是毫秒。例如,在5s后弹出提示:

1
2
3
setTimeout(function() {
alert("Times over");
}, 5000);

循环中的 setTimeout

1
2
3
4
5
for (var i = 0; i <= 3; i++) {
setTimeout(function logger() {
console.log(i);
}, 0);
}

循环中,在 0ms 后调用 logger 函数输出 i 的值。那么结果应该是:0 1 2 3?

但实际代码的输出是:

1
4 4 4 4

了解 setTimeout

1
2
3
4
5
6
7
var start = new Date;
setTimeout(function logger(){
var end = new Date;
console.log('Time elapsed:', end - start, 'ms');
}, 500);
while (new Date - start < 1000) {};

执行代码片段后可以发现代码输出 Time elapsed: 10XXms。也就是说,logger函数事实上是在while 后执行的。

在 JavaScript 中,setTimeout 所传入的函数在线程空闲之前不会调用。在线程空闲后,并且满足 setTimeout 所设定的 delay 值后,函数才会被调用。在上面的代码中,logger函数 只有在 for 循环结束后才会被调用;而 for 循环结束时,i 的值为 4,故程序的输出为 4 4 4 4。

setTimeout 中函数的 this

1
2
3
4
5
6
7
8
9
10
11
12
function setTimeoutTest() {
this.name = "Test function";
console.log(this);
for (var i = 0; i <= 3; i++) {
setTimeout(function logger() {
console.log(i);
console.log(this);
}, 0);
}
}
new setTimeoutTest();

上面的代码在控制台上输出两个变量:this 和 i。

可以发现前后 this 的指向是不同的。在使用 new setTimeoutTest 之后,在 setTimeoutTest 内部 this 的值指向 setTimeoutTest 的一个实例,故第一个 this 指向 {name: "Test function"}; logger函数 定义在 setTimeoutTest 函数内部,所以 logger函数 作用域链上保存着 i 以及 this 的值,而 logger函数是在全局作用域下调用的,此时作用域链上i的值依然是 4,但是 this 的值指向了 window。所以函数最终的输出为:

1
2
3
4
{name: "Test function"}
4 window
4 window
4 window

参考资料:

  • window.setTimeout - MDN

Bootstrap themes

发表于 2013-02-07 | | 阅读次数

  1. Bootswatch (免费)

  2. WrapBootstrap (主题商城)

  3. BootstrapThemeRoller (定制)

Learning Ruby with the Neo Ruby koans

发表于 2013-02-03 | | 阅读次数

MacOSX Mountain Lion下使用rvm安装ruby 1.9.3

发表于 2013-02-02 | | 阅读次数

在MacOSX Mountain Lion with XCode 4.5.2/4.6下使用rvm安装ruby 1.9.3会出现compile错误:

Error running ‘make’, please read /Users/ivan/.rvm/log/ruby-1.9.3-p374/make.log
There has been an error while running make. Halting the installation.

make.log中的错误信息:

compiling regparse.c
regparse.c:582:15: error: implicit conversion loses integer precision: 'st_index_t' (aka 'unsigned long') to 'int' [-Werror,-Wshorten-64-to-32]
return t->num_entries;</blockquote>

解决方法:

rvm install 1.9.3 --with-gcc=gcc

参考资料 :

  • XCode 4.6 break rvm
1…222324…37
IIssNan

IIssNan

胡编一通,乱写一气

183 日志
6 分类
111 标签
RSS
GitHub Twitter 豆瓣 知乎
© 2011 - 2017 IIssNan
由 Hexo 强力驱动
主题 - NexT.Pisces
0%