方法一:
var foo = function () {
//code
}
方法二:
function foo () {
//code
}
方法一:foo在进入函数执行上下文开始执行代码的时候,foo是undefined的,执行完var foo = function () { }这句,foo才会得到赋值;
方法二:在进入函数执行上下文开始执行代码的时候,foo已经是一个function了。
一旦进入执行上下文(在执行代码之前),VO(变量对象)就会被一些属性填充:
函数的形参(当进入函数执行上下文时)
变量对象的一个属性,其属性名就是形参的名字,其值就是实参的值;对于没有传递的参数,其值为undefined
变量对象的一个属性,其属性名就是形参的名字,其值就是实参的值;对于没有传递的参数,其值为undefined
函数声明(FunctionDeclaration, FD) —— 变量对象的一个属性,其属性名和值都是函数对象创建出来的;如果变量对象已经包含了相同名字的属性,则替换它的值
变量声明(var,VariableDeclaration) —— 变量对象的一个属性,其属性名即为变量名,其值为undefined;如果变量名和已经声明的函数名或者函数的参数名相同,则不会影响已经存在的属性。
Declarations, Names, and Hoisting (声明和变量提升)
In JavaScript, a name enters a scope in one of four basic ways:
- Language-defined: All scopes are, by default, given the names this and arguments.
- Formal parameters: Functions can have named formal parameters, which are scoped to the body of that function.
- Function declarations: These are of the form function foo() {}.
- Variable declarations: These take the form var foo;.
对匿名函数的一种做法,也就是我们看到的jQuery片段——使用()将匿名函数括起来,然后后面再加一对小括号(包含参数列表)。
小括号能把我们的表达式组合分块,并且每一块,也就是每一对小括号,都有一个返回值。这个返回值实际上也就是小括号中表达式的返回值。所以,当我们用一对小括号把匿名函数括起来的时候,实际上小括号返回的,就是一个匿名函数的Function对象。因此,小括号对加上匿名函数就如同有名字的函数被我们取得它的引用位置了。所以如果在这个引用变量后面再加上参数列表,就会实现普通函数的调用形式。
在Firefox, Safari, Chrome, and Opera下,可以使用 name来获得函数名称。
匿名函数的name属性是空字符串。
//这是错误的,不要这样做啊!!
if(condition){ //目的是通过判断然后决定函数的操作
function sayHi(){alert(“Hi!”);}
} else {
function sayHi(){ //但是大部分浏览器都会返回这个函数,除了Firefoxalert(“Yo!”);}
}
var sayHi; //但是如果先定义sayHi变量是可以的,当一个函数作为变量来使用,那么sayHi就是一个函数表达式
if(condition){
sayHi = function(){alert(“Hi!”);};
} else {
sayHi = function(){alert(“Yo!”);};
}