JavaScript函数作用域和声明提前

1
2
3
4
5
6
7
8
9
10
function test(o) {
var i = 0;
if (typeof o == "object") {
var j = 0;
for (var k = 0; k < 10; k++) {
console.log(k);
}
console.log(k);
}
console.log(j);

}
test(new String(123));

这段代码在不同位置定义的i,j,

1
2
3
4
5
6
7
8
9
10
function test(o) {
var i = 0;
if (typeof o == "object") {
var j = 0;
for (var k = 0; k < 10; k++) {
console.log(k);
}
console.log(k);
}
console.log(j);

}
test(new String(123));

这段代码在不同位置定义的i,j,k,它们都在同一个作用域内,所以它们在函数体内均是有定义的,同时如果在这个函数体内还嵌套了其他函数体,那么一样在嵌套的函数体内也会有定义。

1
2
3
4
5
6
7
var scope = 'globe';
function f() {
console.log(scope);
var scope = 'local';
console.log(scope);
}
f();

上面这段代码按照习惯你也许会认为第一行会输出globe,但是其实是undefined,因为JavaScript的声明提前(不包括赋值),上面这段代码其实等价于

1
2
3
4
5
6
7
8
var scope = 'globe';
function f() {
var scope;
console.log(scope);
scope = 'local';
console.log(scope);
}
f();

由于只是声明提前,没有包括赋值操作,所以会是undefined