函数表达式
函数表达式是 JavaScript 中的一个既强大又容易令人困惑的特性。
定义函数表达式的方法
1. 函数声明
function functionName(arg0,arg1,arg2){// 函数体}
先有 function 关键字,然后是函数的名字,就是指定函数名的方式。他还有一个重要特征就是 <font color=”red”> 函数声明提升 </font> 意思是在执行代码之前会先读取函数声明。(意味可以将函数声明放在调用它的语句后面)如下:
sayHi()
function sayHi(){alert("Hi!");
}
2. 函数表达式
函数表达式有几种不同的语法形式, 下面是最常见的一种。
var functionName=function(arg0,arg1,arg2){// 函数体}
创建一个函数并将它赋值给变量 functionName, 创建的函数叫做 <font color=”red”> 匿名函数 </font>, 因为 function 关键字后面没有标识符。(匿名函数也叫做 <font color=”red”> 拉姆达函数 </font>) 匿名函数的 name 属性是空字符串。
递归
递归函数是在一个函数通过名字调用自身的情况下构成的如下:
function factorial(num){if(num<=1){return 1;}else{return num*factorial(num-1);
}
}
1.arguments.callee 是一个指向正在执行的函数的指针,因此可以用来实现对
函数的 <font color=”red”> 递归调用 </font> 如下:
function factorial(num){if(num<=1){return 1;}else{return num*arguments.callee(num-1);
}
}
用 arguments.callee 代替函数名,可以确保无论怎样调用函数都不会出问题。但是在 <font color=”red”> 严格模式 </font> 下访问 arguments.callee 属性会出错。可以使用命名函数表达式来达到相同的结果。如下:
var factorial=(function f(num){if(num<=1){return 1;}else{return num*f(num-1);
}
}
这种方式在严格模式和非严格模式都可以使用。
闭包
闭包是指有权访问另一个函数作用域的变量的函数,创建闭包的常见方式,就是在一个函数内部创建另一个函数。如下:
function init(){
var name="Mike";
function displayName(){alert(name);
}
displayName();}
init()
init()函数创建了一个局部变量 name 和一个名为 displayName()的函数。displayName()函数是定义在 init()里面的内部函数,仅在该函数体内使用。
displayName()没有自己的局部变量,然而它可以访问到外部函数的变量,所以 displayName()可以使用父函数 init()中声明的变量 name。
注意: 由于闭包会携带它的函数作用域, 因此会比其它函数占用更多内存。过度使用闭包可能会导致内存占用过多。
this
在全局函数中,this 等于 window,而当函数作为某个对象的方法调用时,this 等于那个对象。不过匿名函数的执行环境具有全局性,因此其 this 对象通常指向 window
如果在通过 call()或 apply()改变函数执行环境的情况下,this 就会指向其它对象。