第四章 变量 函数和运算符
4.1 ① 变量声明
变量声明是通过var语句来完成的,并且所有的var语句都提前到包含这段逻辑的函数的顶部执行。
function doSomething() {
var result = 10 + value;
var value = 10;
return result;
}
// 编译器理解为
function doSomething() {
var result; // 这里为undefined
var value; // 这里为undefined
result = 10 +value;
value = 10;
return result;
}
变量声明提前意味着:在函数内部任意地方定义变量和在函数顶部定义变量是完全一样的。因此,一种流行的风格是将所有变量声明放在函数的顶部而不是散落在各个角落,简言之,依照这种风格写出的代码逻辑和JavaScript引擎解析这段代码的习惯是一样的。
作者还进一步推荐单var语句,每个变量的初始化独占一行,赋值运算符应当对齐(个人觉得没必要- -,并且后面的事例代码的风格也没有遵守这条),对于那些没有初始值的变量来说,他们应当出现在var语句的尾部。
// 好的声明
function doSomethingWithItems(items) {
var value = 10,
result = value + 10,
i,
len;
for (i=0, len=items.length; i < len; i++) {
doSomething(items[i]);
}
}
4.2 ② 函数声明
总是先声明函数后使用,函数声明不应当出现在语句块之内。
// 不好的写法
doSomething();
function doSomething() {
alert("Hello world");
}
// JS引擎理解为
function doSomething (){
alert("Hello world");
}
doSomething();
// 不好的写法,明确禁止
if (condition) {
function doSomething() {
alert("Hi!");
}
} else {
function doSomething() {
alert("Yo!");
}
}
4.3 ③ 函数调用间隔
对于函数调用写法推荐的风格是,在函数名和左括号之间没有空格,这样做是为了将它和块语句(block statement)区分开来。
// 好的写法
doSomething(item);
// 不好的写法: 看起来像一个块语句
doSomething (item);
// 用来作对比的块语句
while (item) {
// 代码逻辑
}
4.4 ④ 立即调用的函数
立即调用的函数用一对圆括号包起来。
// 好的写法 var value = (function () { //函数体 return { message: "Hi" } }());
4.5 ⑤ 严格模式
不推荐将"use strict"用在全局作用域中,因为这样会让文件中的所有代码都以严格模式解析,其他文件(非严格模式下的)代码很可能报错。
// 不好的写法
"use strict"
function doSomething () {
//代码
}
// 好的写法
function doSomething () {
"use strict"
// 代码
}
4.6 ⑥ 相等
由于JavaScript具有强制类型转换机制(type coercion),JavaScript中的判断相等操作是很微妙的。对于某些运算来说,为了得到成功的结果,强制类型转换会驱使某种类型的变量自动转换成其他不同类型,这种情形往往会造成意想不到的结果。So,注意底下这句:
所有情形推荐使用===和!==
4.6.1 ⑦ eval
就一句话: 实在无它法时才用eval();
4.6.2 ⑧ 原始包装类型
JavaScript里有三种原始包装类型:String,Booleanl,Number。它的主要作用是:让原始值具有对象般的行为。
还是一句话:禁止使用原始包装类型。
// 不好的做法
var name = new String("Nicholas");
var author = new Boolean(true);
var count = new Number(10);
理由:开发者的思路常常会在对象和原始值之间跳来跳去,这样会增加出bug的概率,从而使开发者陷入困惑。你也没有理由自己手动创建这些对象。