JavaScript函数表达式
闭包
闭包是指有权访问另一个函数作用域的变量的函数。
匿名函数的执行环境具有全局性。外围函数返回的匿名函数仅仅是定义,还尚未执行;函数内部的this对象指向函数据以执行的环境对象,当匿名函数被执行时,返回的匿名函数所处的执行环境是全局环境,故而this指向全局环境的变量对象。
var name = "Bob";
function out() {
var name = "Tom";
return function() {
return this.name;
}
}
alert(out()()); // Bob
函数表达式
如果function关键字是语句的开始,则这是一个函数声明。若要将函数声明转为函数表达式只需要用"()"括住函数声明即可。
私有变量
任何在函数中定义的变量,都可以认为是私有变量。私有变量包括函数的参数、局部变量和函数内部定义的其他函数。
特权方法指有权访问私有变量和私有函数的公有方法。
创建私有变量的常用方法是构造函数模式:
function Test(name) {
var age = 24;
this.sayName = function() {
return name;
};
}
alert(new Test("Tom").sayName()); // Tom
alert(new Test("Tom").age); // undefined
构造函数内部的age、name是私有变量,不是实例变量(this.valueName),实例方法sayName是特权方法,能够访问name私有变量。
静态私有变量
为了解决创建多个实例时会重复创建特权方法的问题,可以:
- 在匿名函数表达式中定义私有变量和私有函数
- 创建全局变量对象,并用匿名构造函数初始化
- 在全局变量的原型中定义公有方法
(function() {
var privateValue = 24;
function privateFunction() {
alert("Hello,world!");
}
// 用匿名构造函数初始化全局对象
Obj = function(){
};
Obj.prototype.publicMethod = function() {
alert(privateValue);
privateFunction();
};
})();
m = new Obj();
m.publicMethod();
模块模式
模块模式是为单例创建私有变量和特权方法。
所谓单例,指的就是只有一个实例的对象。按照惯例,JavaScript以对象字面量来创建单例对象。
- 在匿名函数中定义私有变量和私有函数
- 匿名函数返回一个对象字面量形式的对象
- 在对象字面量中定义特权方法和公有变量
(function() {
var privateValue = 24;
function privateFunction() {
alert("Hello,world!");
}
return {
publicProperty: "public",
publicMethod: function() {
alert(privateValue);
privateFunction();
}
};
})().publicMethod();
增强模块模式
增强模式返回的单例都是Object类型的,如果需要特定类型的单例,可以使用增强模块模式:
- 在匿名函数中定义私有变量和私有函数
- 在匿名函数中,创建特定类型的单例对象
- 为单例对象添加特权方法和公有属性
- 返回单例对象
test = (function() {
var privateValue = 24;
function privateFunction() {
alert("Hello,world!");
}
Bob = new Student();
Bob.publicProperty = "public",
Bob.publicMethod = function() {
alert(privateValue);
privateFunction();
};
return Bob;
})();
function Student() {
}
test.publicMethod();
alert(test instanceof Student); // true