定义函数的两种方式:函数声明和函数表达式。
函数声明:
sayHi();
function sayHi() {
alert("hi");
}//这个可以在后面 叫做函数提升 function declaration hiosting
函数表达式: var functionName = function(arg0,arg1,arg3){
//函数体
};
这样创建的一个函数并把它赋值给一个变量funcitonName的方式称为匿名函数。不存在函数提升,必须先var一个变量然后赋值。
1.递归
为了防止函数变量中途指向null或别处,导致递归失败,可以使用argument.callee();在return中,该指针指向正在执行的函数,从而代替函数变量名。
2.闭包
闭包指的是有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式就是在一个函数内部创建另一个函数。
3.模仿块级作用域
JS没有块级作用域的概念,在块语句中定义的变量,实际上是早包含函数中而非语句中创建的。
匿名函数可以用来模仿块级作用域。
(function() {
//这是块级作用域
})();匿名函数声明包含在一对圆括号里,表示它实际上是一个函数表达式。随后的另一对圆括号会立即调用这个函数。
在块级作用域里面的定义的变量外界不能访问。而这个匿名函数是一个闭包,能够访问包含作用域(外面的那层)中的所有变量。
4.私有变量
严格来说,JS没有私有成员的概念,所有对象属性都是公有的,但是有一个私有变量的概念,任何在函数中定义的变量,都可以认为是私有变量,因为不能在函数的外部访问这些变量。 然而闭包可以访问这些变量,利用这一点,可以创建用于访问私有变量的公有方法。创建方法:在构造函数内部,this.xxx = function定义一个函数,函数内部可以修改返回私有变量,这个函数可以在构造函数外面被调用。却迪阿尼就是针对每个实例,都会创建一组新方法。
4.1 静态私有变量
在一个私有作用域中,定义构造函数及其公有方法,公有方法是在prototype上定义的。构造韩式是通过函数表达式,且不使用var,初始化一个未经声明的变量即创造了一个全局变量,这样外面就可以使用。
此时通过构造函数定义的所有实例,都会共享私有作用域内定义的变量,变量是一个静态的,由所有实例共享的属性。
4.2模块模式
用于为自定义类型创建私有变量和特权方法。所谓单例,指的是只有一个实例的对象。