函数表达式
Posted webenjoy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数表达式相关的知识,希望对你有一定的参考价值。
函数表达式:
一、Function类型:
1、定义函数的方式:
1)函数声明;
2)函数表达式;
3)使用Function构造函数。
2、函数名仅是指向函数的指针。
3、函数没有重载。
4、函数声明提升:
1)在代码开始执行前,解析器会先读取函数声明,并将其添加到执行环境中。
2)函数声明会覆盖变量声明,但不会覆盖变量赋值。
5、作为值的函数:函数不仅可以作为参数传递,而且可以作为另一个函数的结果返回。
function compare(property) {
return function(obj1, ojb2) {
var value1 = obj1[property];
var value2 = obj2[property];
if(value1 < value2) {
return -1;
}else if(value1 > value2) {
return 1;
}else {
return 0;
}
};
}
arr.sort(compare(property));
6、函数内部属性:
1)arguments是一个类数组对象,用来保存函数的参数。
2)arguments.callee指向拥有arguments对象的函数。
function factorial(num) {
if(num <= 1) {
return 1;
}else {
return num * arguments.callee(num-1);
}
}
3)arguments.callee.caller指向调用当前函数的函数。
4)this引用的是函数据以执行的环境对象,在全局作用域中调用函数,this对象引用的就是window。
7、函数属性和方法
1)属性:
length:表示函数希望接收的命名参数个数。
prototype:指向函数的原型对象。
2)方法:
apply()与call()的用途都是在特定的作用域中调用函数(扩充函数赖以执行的作用域),实际上等于设置函数体内this对象的值。
apply()方法接收两个参数:第一个是作用域对象(this值),第二个是参数数组(或argumets对象)。
call()方法接收多个参数:第一个是作用域对象(this值),其余参数必须逐个列举。
二、闭包
1、闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的常见方式,是在一个函数内部创建另一个函数。
2、闭包只能获取包含函数中任何变量的最后一个值。
3、匿名函数也叫拉姆达函数,匿名函数的执行环境具有全局性,其this对象通常指向window。
4、闭包的问题:
1)闭包携带包含函数的作用域,因此会比其他函数占用更多的内存。
2)IE9以下浏览器,在闭包中调用html对象,会导致元素无法销毁,引发内存泄漏。
5、闭包的作用:
1)模仿块级作用域:
(function() {
// 块级作用域
})();
2)为私有变量创建特权方法:
私有变量包括函数的参数、局部变量和在函数内部定义的其他函数。
有权访问私有变量和私有函数的公有方法称为特权方法。
A、构造函数模式:
function MyObject() {
// 定义私有变量和私有函数
// 特权方法
this.publicMethod = function() {};
}
B、原型模式:
(function() {
// 定义私有变量和私有函数
MyObject = function() {};
// 特权方法
MyObject.prototype.publicMethod = function() {};
})();
C、模块模式(适合单例,单例是指只有一个实例的对象):
var singleton = function() {
// 定义私有变量和私有函数
// 特权方法、公有属性
return {
publicProperty: ‘‘,
publicMethod: function() {}
};
}
以上是关于函数表达式的主要内容,如果未能解决你的问题,请参考以下文章