前文在这里。
Notes
今天的内容是Chapter2里提到过的Appendix D。这个只能在网上下到。
Useful Stuff
Appendix D主要是讲JavaScript这个语言的。看了他给的小测试,虽然已经学完codeacademy了,但确实还有很多不明白的地方。真的是平易近人的好书啊(再次感叹起来
JS的两种scope:
- global scope
- function scope, or local scope
这个是常规理解,global里变量local可以用(scope inheritance),local只可以在local里用。
怎么处理local和global变量?书提供了一个好原则:
The rule of thumb is always declare variables in the scope in which they belong using the VAR statement.
同时为了方便区分global和local变量,在local中用时,总在global前面加上window.前缀以示区分。虽然代码会多一点,但是比较清晰。
Variable hoisting是JS的一个特点,即JS会自己把这个scope中所有变量定义放到最前面。所以如果你在中间才定义赋值一个变量,很可能它会显示没被定义,undefined。
注意JS没有block scope之说,即在for、if-else语句block中,是不能declare新变量的。
所以都在scope一开始declare吧!这样后面用的时候都不会有问题。
唔还有两条金科玉律:
- It's best practice to define functions as variables.
i.e.var functionName = function() {};
- As applications grow, your aim should be to keep the global scope as clean as possible.
When you truly need global variables, a good approach is to create a container object in the global scope.
i.e.var globalObject = {key1: value1, key2: value2, ...... };
Then reference any variable using the fully qualified reference: e.g.globalObject.key1
.
This approach also reduces the risk of having conflicting global variables.
下面关注Logic flow。提了good practice:
- 总是给if-else和for加花括号组然
- 用exact equal ===和!==而不是==和!=,
- for里面的i之类的变量也要在scope一开始处declare好
- array.length先用一个变量装,这样就不用每次走循环一次就check一次array length。
- opening bracket on the same line as statement
- use whitespace! All for readability!
JSON = JavaScript Object Notation
两条object里key的要求:
key必须是string。如果是保留字段或者非法JS变量名,要带双引号。
常用. (dot notation) 来获取object里面key对应的value。
但JSON所有key必须要带双引号,function不能当做value。(想想也是,因为JSON是一种数据形式,很少会把函数当成数据传输的。)
Allowed data types:
- String
- Number
- Object
- Array
- Boolean
null
作为value的String如果想要包括双引号,就用\“
、\”
这些escape characters。
下面讲Callbacks。这个我是不知道了呀,只是在MATLAB里写过。
嗯定义说它是一个anonymous function。然后一看,原来就是把function直接放在args的地方呀。
比如:var timer = setTimeout(function() {}, 2000);
第一个function就是callback。
Callbacks are asynchronous. 也就是说不会出现了就运行。
创建一个用callback的函数:
var functionName = function(callback, args) { ...... callback(); };
需要注意的地方是,callback function scope并不inherits调用它的function的scope,而是在哪儿定义就inherits哪儿。要想把变量从调用callback的function scope推入callback function scope,可以给callback function加一个argument,这样就可以pass it in。
当然了,为了方便测试,named callbacks就出场了。其实就是pass function as argument的概念,没什么新的。
Node uses callbacks to delegate the waiting to other processes, making it asynchronous. <-原来重点在这儿等着呐。
Nested callbacks are used to run asynchronous functions one after another. But too many nested stuff would become nested callback hell. So we use named callbacks to avoid this.
JS的Module Pattern:
_varName -> private
varName -> public
it's kind of like a class(?) 在JS这里叫做closure。
定义方法:
var myClosure = ( function() {} ) ( ) ;
return里面的东西是methods exposed,就像Java class里的public methods一样。