函数表达式是JavaScript中的一个既强大有容易令人困惑的特性 定义函数的方式有两种,一种是函数声明,另一种就是函数表达式
关于函数声明,它的一个重要特征就是函数声明提升,意思是在执行代码前会读取函数声明,这就意味着可以把函数声明放在调用它的语句后面
sayHi(); function sayHi(){alert("hi");}
第二种创建函数的方式是使用函数表达式,函数表达式有几种不同的语法形式
最常见的一种方式是
var functionName = function(arg0,arg1,arg2){ //函数体 };
理解函数提升的关键,就是理解函数声明与函数表达式之间的区别 例如 执行以下代码的结果可能会让人意想不到
if(conditon){ function sayHi(){alert("yes");} else function sayHi(){alert("no");} }
大多数情况下,浏览器会返回第二个申明,忽略condition
闭包
不少开发人员搞不清匿名函数和闭包的概念 闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见方式,就是在一个函数内部创建另外一个函数
私有变量:严格来讲JavaScript中没有私有成员的概念;所有对象属性都是公有的,不过倒是有一个私有变量的概念,任何在函数中定义的变量,都可以认为是私有变量,因为不能再函数的外部访问这些变量,私有变量包括函数的参数,局部变量和在函数内部定义的其他函数
function add(num1,num2){
var sum = num1 + num2;
return sum;
}
在这个函数内部,有三个私有变量,num1,num2,sum 在函数内部可以方位这几个变量,但在函数外部则不能访问他们,如果在这个函数内部创建一个闭包,那么闭包通过自己的作用域链也可以访问这些变量,而利用这一点,就可以创建用于访问私有变量的公有方法
我们把有权访问私有变量和私有函数的公有方法称为特权方法,有两种在对象上创建特权的方式,第一种是在构造函数中定义特权方法,基本模式如下
function Person(name){ this.getName = function(){return name;}; this.setName = function(value){name = value;}; } var person = new Person("niko"); alert(person.name);// person.setName("gred"); alert(person.name);
以上代码定义了两个特权方法,这两个方法都可以再构造函数外部使用
静态私有变量 通过在私有作用域中定义私有变量或者函数,同样可以创建创建特权方法
(function(){ var privateViarable = 10;//私有变量和私有函数 function privateFunction(){return false;} MyObject = function(){};//构造函数 MyObject.prototype.publiceMethod = function(){privateViarable++;return privateFunction();}; })();
模块模式:前面的模式是用于为自定义类型创建私有变量和特权方法的而道格拉斯所说的模块模式则是为单例创建私有变量和特权方法,所谓单例,指的就是只有一个实例的对象,按照惯例,JavaScript是以对象字面量的方式来创建单例对象的
var singleton = { name: value; method : function(){ //这里是代码的方法 } };
var singleton = function(){ var privateVariable = 10; function privateFunction(){return false;} //特权,公有方法和属性 return{publicProperty : true, publicMethod : function(){privateVariable++;return privateFunction();}}; };();