Javascript函数是将要执行的代码以及执行这些代码的作用域构成的一个综合体。在计算机科学术语里,这种代码和作用域的综合体叫做闭包。所有的Javascript函数都是闭包。在上面讨论的那种情况,也就是说,当一个嵌套函数被导出到它所定义的作用域外时,这种闭包才是有趣的。当一个嵌套的函数以这种方式使用的时候,它常常明确的叫做一个闭包。
循环里的setTimeout
setTimeout函数的定义
Calls a function or executes a code snippet after a specified delay.
在指定的延迟后,执行代码/函数
setTimeout
函数接收两个参数,语法为:
|
|
第一个是将要执行的代码片段或者函数,第二个参数是延迟时间,单位是毫秒。例如,在5s
后弹出提示:
|
|
循环中的 setTimeout
|
|
循环中,在 0ms
后调用 logger 函数输出 i
的值。那么结果应该是:0 1 2 3
?
但实际代码的输出是:
|
|
了解 setTimeout
|
|
执行代码片段后可以发现代码输出 Time elapsed: 10XXms
。也就是说,logger函数
事实上是在while
后执行的。
在 JavaScript 中,setTimeout
所传入的函数在线程空闲之前不会调用。在线程空闲后,并且满足 setTimeout
所设定的 delay
值后,函数才会被调用。在上面的代码中,logger函数
只有在 for
循环结束后才会被调用;而 for
循环结束时,i
的值为 4,故程序的输出为 4 4 4 4
。
setTimeout 中函数的 this
|
|
上面的代码在控制台上输出两个变量:this
和 i
。
可以发现前后 this
的指向是不同的。在使用 new setTimeoutTest
之后,在 setTimeoutTest
内部 this
的值指向 setTimeoutTest
的一个实例,故第一个 this
指向 {name: "Test function"}
; logger函数
定义在 setTimeoutTest
函数内部,所以 logger函数
作用域链上保存着 i
以及 this
的值,而 logger函数是在全局作用域下调用的,此时作用域链上i的值依然是 4,但是 this
的值指向了 window
。所以函数最终的输出为:
|
|
参考资料:
Bootstrap themes
- Bootswatch (免费)
- WrapBootstrap (主题商城)
- BootstrapThemeRoller (定制)
Learning Ruby with the Neo Ruby koans
MacOSX Mountain Lion下使用rvm安装ruby 1.9.3
在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
参考资料 :