首页 > 代码库 > 第7章 函数表达式
第7章 函数表达式
定义函数方式有两种:函数声明,函数表达式
函数声明有一个重要特征:函数声明提升
7.1 递归
function func(num){
if (num<=1){
return 1;
}else{
return num*func(num-1);
}
}
这是一个经典的阶乘函数
arguments.callee式一个指向正在执行的函数的指针,可以代替函数名
7.2 闭包
闭包是指有权访问另一个函数作用域中的变量的函数
闭包只能取得包含函数中任何变量的最后一个值。见p181
function fn(propertyName){
return function(object1){
var v1 = object1[propertyName]; //访问了外部变量propertyName变量
}
}
由于闭包会携带包含它的函数的作用域,因此会比其他函数占用更多的内存,过度使用闭包可能会导致内存占用过多。所以建议只是在绝对必要时再考虑使用闭包。
7.2.2 关于this对象
全局函数中,this=window,当函数被当作某个对象的方法调用时,this等于那个对象。匿名函数的执行环境具有全局性,因此对象通常指向window.
https://zhuanlan.zhihu.com/p/23804247
7.2.3 内存泄漏
如果闭包的作用域中保存着一个HTML元素,那么就意味着该元素无法被销毁。
function assignHandler(){
var element = document.getElementById(‘someElement’);
var id = element.id;
element.onclick = function(){
alert(id);
};
element = null; //变量设置为null,才能解除对DOM对象的引用,顺利减少引用数,确保正常回收其占用的内存
}
7.3模仿块级作用域
(function(){
//这是块级作用域
})();
上述代码立即调用了一个匿名函数,将函数声明包含在一对圆括号中,表示它实际上是一个函数表达式,后面的圆括号立即调用了这个函数。
这种方法可以减少闭包占用的内存问题,没有指向匿名函数的引用。
7.4 私有变量
任何函数中定义的变量都可以认为是私有变量,包括函数的参数、局部变量和在函数内部定义的其他函数
function MyObject(){
//私有变量
var privateVariable = 10;
function privateFunction(){
return false;
}
//特权方法
this.publicMethod = function(){
privateVariable ++;
return privateFunction();
}
}
7.4.1静态私有变量
(function(){
var privateVariable = 10;
function privateFunction(){
}
Myobject = function(){
}
//公有/特权方法
Myobject.prototype.publicMethod = function(){
privateVariable ++;
return privateFunction();
}
})()
这个模式创建了一个私有作用域,并在其中封装了一个构造函数及相应的方法。
7.4.2模块模式
单例创建私有变量和特权方法。所谓单例就是只有一个实例的对象。简单的语法如下:
var singleton = {
name: value,
method: function(){
//这里是方法
}
}
还可以添加私有变量和特权方法
var singleton = function(){
//私有变量和私有函数
var privateVariable = 10;
function privateFunction(){}
//特权/公有方法和属性
return {
publicProperty: true,
publicMethod: function(){
privateVariable++;
return privateFunction();
}
}
}
这个模式返回了一个匿名函数,在函数内部,定义私有变量和函数,然后将一个对象字面量作为函数的值返回。返回的对象字面量中只包含可以公开的属性和方法。
7.4.3增强的模块模式
var singleton = function(){
//私有变量和私有函数
var privateVariable = 10;
function privateFunction(){
return false;
}
//创建对象
var object = new CustomType();
//添加特权/仅有属性和方法
object.publicProperty = true;
object.publicMethod = function(){
privateVariable++;
return privateFunction();
};
return object;
}
第7章 函数表达式