一、函数声明与函数表达式
使用函数声明时,都会给函数定义一个name属性,该属性用于得到函数指定的名字。且它的另一个重要特征是函数声明提升,简言之就是函数声明可以放在调用其函数语句的后面,而函数表达式不行,否则会出错。
【示例】
<script type="text/javascript">
function Person() {
}
alert(Person.name);//Person
</script>
二、递归函数
【描述】
递归函数是在一个函数通过名字调用自身的情况下构成的。
【示例】
<script type="text/javascript">
function f(num) {
if (num <= 1) {
return 1;
}
else {
return num * arguments.callee(num - 1);
}
}
alert(f(5));//120
</script>
三、闭包
【描述】
闭包是指有权访问另一个函数作用域中的变量的函数。
【常见方式】
在一个函数内部创建另一个函数
【示例】
<script type="text/javascript">
function Person(age) {
return function(object1,object2) {
var a = object1.age;
var b = object2.age;
if (a > b) {
return object1;
}
else {
return object2;
}
};
}
//此时返回的是一个函数
var compare = Person(23);
//调用返回的函数
var result = compare(24, 34);
alert(result);//34
//解除对匿名函数的引用,以便释放内存
compare = null;
var result2 = compare(34, 25);
alert(result2);//出错
</script>
分析:
作用域链本质上是一个指向变量对象的指针列表,它只引用但不实际包含变量对象。
3.1 闭包与变量
3.1 闭包与变量
作用域链的这种配置机制有一个副作用,即闭包只能取得包含函数中任何变量的最后一个值。记住,闭包所保存的是整个变量对象,而不是某个特殊的变量。
【示例】
<script type="text/javascript">
function example() {
var array = new Array();
for (var i = 0; i< 10; i++) {
array[i] = function () {
return i;
};
}
return array;
}
var exam = example();
for (var i = 0; i < exam.length; i++) {
alert(exam[i]());//全部是10
}
</script>
很明显,这不是我们想要的,因为我们已经确认过眼神了。接下来需要进行改造,遇到那个对的人。
【示例】
<script type="text/javascript">
function example() {
var array = new Array();
for (var i = 0; i < 10; i++) {
array[i] = function (num) {
return function () {
return num;
};
}(i);
}
return array;
}
var exam = example();
for (var i = 0; i < exam.length; i++) {
alert(exam[i]());//0,1,2,3,4,5,6,7,8,9
}
</script>