标签:javascript 编程实践 读书笔记
本系列作为Effective JavaScript的读书笔记。
JavaScript中并没有Block Scoping,只有Function Scoping。
因此如果在一个Block中定义了一个变量,那么这个变量相当于是被定义到了这个Block属于的Function中,比如:
function isWinner(player, others) {
var highest = 0;
for (var i = 0, n = others.length; i < n; i++) {
<span style="color:#ff0000;">var player = others[i];</span>
if (player.score > highest) {
highest = player.score;
}
}
return player.score > highest;
}
上面的代码中,在for循环中声明了一个变量player,因为Variable Hoisting的原因,这个变量实际上被声明成了下面这个样子:
function isWinner(player, others) {
<span style="color:#ff0000;">var player;</span>
var highest = 0;
for (var i = 0, n = others.length; i < n; i++) {
<span style="color:#ff0000;">player = others[i];</span>
if (player.score > highest) {
highest = player.score;
}
}
return player.score > highest;
}
因此,传入到function中的player参数被覆盖掉了。程序不能按预期行为运行。
在JavaScript中,对于变量的声明实际上包含了两个部分:
JavaScript会通过Variable Hoisting将第一个部分,也就是声明的部分,放到包含变量的function的头部。
在下面这个例子中:
function trimSections(header, body, footer) {
for (var i = 0, n = header.length; i < n; i++) {
header[i] = header[i].trim();
}
for (var i = 0, n = body.length; i < n; i++) {
body[i] = body[i].trim();
}
for (var i = 0, n = footer.length; i < n; i++) {
footer[i] = footer[i].trim();
}
}
因为VariableHoisting的缘故,i和n都会被放到function的开始处,所以实际上只声明了两个变量,在for循环中,会对它们进行赋值,实际的行为是这样的:
function trimSections(header, body, footer) {
<span style="color:#ff0000;">var i, n;</span>
for (i = 0, n = header.length; i < n; i++) {
header[i] = header[i].trim();
}
for (i = 0, n = body.length; i < n; i++) {
body[i] = body[i].trim();
}
for (i = 0, n = footer.length; i < n; i++) {
footer[i] = footer[i].trim();
}
}
正因为VariableHoisting的存在,一些程序员偏好将变量定义在function的开始处,相当于完成了一次手动地Hoisting。这样做的目的是为了避免歧义性,让代码更加清晰。
但是,有一个特殊情况,在try…catch语句中,catch block中的参数会被绑定到该block中:
function test() {
var x = "var", result = [];
result.push(x);
try {
throw "exception";
} catch (x) {
<span style="color:#ff0000;">x = "catch";</span>
}
result.push(x);
return result;
}
test(); // ["var", "var"]
重点:
Effective JavaScript Item 12 理解Variable Hoisting
标签:javascript 编程实践 读书笔记
原文地址:http://blog.csdn.net/dm_vincent/article/details/39153783