作为从一开始接触C、C++、C#的程序员而言,JavaScript的语法对我来说有些古怪,通过最近一年的接触,对它有了一定的了解,于是想把它的一些语法要点记录下来。
1. Block Scope vs. Function Scope
JavaScript第一点与C不同的是变量的作用范围。我们都知道,C风格的编程语言中,变量的作用范围是两个大括号之间,变量在两个大括号之外是不可见的,我们称之为Block Scope。
而JavaScript则不然 - 变量在真个函数内以及此函数的内嵌函数中均可见,我们称之为Function Scope。比如:
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); // k = 10, k虽然在for循环中定义,可是在for循环之外的整个函数体依然可见。
}
console.log(j); // j =0 或者j = undefined,j虽然在if块中声明并定义,可是它在整个函数体中依然可见。
}
2. Hoisting
JavaScript变量的另外一个奇特的地方还在于,在一个函数体内任何一个地方定义(defined)的变量,都被假定为其在函数的一开始处被定义(但是可能没有初始化)。也就是说,所有变量的定义都被"hoisted"(提升)到函数的开始处。比如下面这个例子:
var scope = "global";
function f(){
console.log(scope); // 输出"undefined",而不是"global",因为本地的scope变量已经生效,只是还没有初始化。
var scope = "local"; // 在此处初始化,但是其实已经在函数的开始处被声明了,因此上面的代码输出的是"undefined"
console.log(scope); //输出"local"
}
总而言之,JavaScript是一个Lexically Scoped Language,即JavaScript是基于词法作用域(lexically scoped)的,所以标识符被固定在它们被定义的作用域而不是语法上或是其被调用时的作用域。