可能在其他语言中看起来有点奇怪,但是在javascript
中,函数确实有两种含义,第一种和其他语言相似,
函数是一段可以反复调用执行的代码。但另一方面
javascript函数也是一种对象,他可以拥有属性和方法
就和一般的对象一样。这也意味着函数在javascript是
如此的重要和多变。因为他是对象,那么他自然可以和
其他对象一样,赋值给一个变量,也就是被引用,另外
他也可以作为另一个函数的返回值或者参数。那么函数
声明和函数表达式有什么区别呢?其实来说,两者并
没有本质的区别,都能创建一个函数对象,只不过函数
表达式是一个完整的语句,但是函数表达式则必须是一个
表达式的一部分,有时他们是没有区别的,区分他们要看
他们所处上下文,比如在一个赋值语句中他是一个表达式,
否则就是一个声明。声明和表达式的区别在于什么呢?
首先我们说一个函数声明会被无条件的提前,即可以提
前调用,但函数表达式则需要执行到他是才能创建一个
函数对象。另外,由于他是表达式的一部分,因此其
作用域也是受限的。比如var fun=function a(){};你只能
依靠fun来调用这个函数对象,a在外部是不可见的。但是
可以在其内部使用,比如var fun=function a(){alert(a.name)}。
我们要时刻记住的是,函数是一个特殊的对象,他会有一个不
公开或不常用的属性叫name;比如你创建一个函数对象,如果
加了标识符,这个标识符就会成为他的name。比如你直接声明
一个函数,function a(){};那么你创建了一个函数对象,其name
属性叫a;另外在表达式中,比如var fun=function(){};fun只是对函数
对象的引用,这个函数对象是一个匿名函数,因此其name属性是
一个空字符串。而不是fun.