接下来的重点是函数。我们知道函数是特殊的对象。
函数作用域和声明提前。JavaScript中没有块级作用域,只有函数作用域:变量在声明它们的函数体以及这个函数体嵌套的任意
函数体内都要定义。
function test(t){ // t在这个函数体内都有定义 var i=0; if(t>0){ var j=0; // j 不仅仅在if语句中,在整个函数体内都有定义 for(var k=0;k<10;k++){ //k 不仅仅在for循环内,在整个函数体内都有定义 console.log(k); // 输出 0-9
} // end for console.log(k); // 输出 10
} //end if console.log(j) ; // 输出 0 }
JavaScript的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的。
作为命名空间的函数:
在函数中声明的变量在整个函数体内都是可见的(包括在嵌套的函数中),在函数的外部是不可见的。不在任何函数内声明的
变量是全局变量,在整个JavaScript程序中都是可见的。这就带来一个问题,当你把不同的JavaScript代码引入到同一个程序中时,无法
确定引入的变量是否已经定义,这样代码就会发生冲突。解决的方法就是将代码放入一个函数内,然后调用这个函数。这样全局变量就
变成了函数内的局部变量。
function mymodule(){
// 模块代码
// 这个模块所使用的所有变量都是局部变量,而不是污染全局命名空间
}
mymodule(); //不要忘了还要调用这个函数
可以直接定义一个匿名函数,并在单个表达式中调用它:
( funtion(){ // mymodule()函数重写为匿名的函数表达式
//模块代码
}() ); //结束函数定义并立即调用它
这种定义匿名函数并立即在单个表达式中调用它的写法非常常见,已经成为一种惯用法了。
我们知道在JavaScript中一切皆对象,JavaScript全局变量是全局对象的一个属性。而局部变量是跟函数调用相关的
某个对象的属性。
如果嵌套函数作为方法调用,其this值指向调用它的对象。如果嵌套函数作为函数调用,其this值不是全局对象(非严格模式下),
就是undefined(严格模式下)。
类
在JavaScript中也可以定义对象的类,让每个对象都共享某些属性,这种共享的特性是非常有用的。(思考:有什么用?怎样用?)
在JavaScript中,类的实现是基于其原型继承机制的。类的所有实例对象都从同一个原型对象上继承属性。因此,原型对象是类的核心。
定义构造函数既是定义类,并且类名(构造函数名)首字母要大写。
JavaScript中类的一个重要特性是"动态可继承"。
定义类是模块开发和重用代码的有效方式之一。