函数表达式,有点像变量赋值,创建这个函数叫匿名函数。
var name = function(){}
function factorial (num){
if(num <= 1){
return 1;
}else{
return num*factorial(num-1);
}
}
但是通过函数名调用时有风险的,比如这样:
var anotherFunction = factorial;
factorial = null;
alert(anotherFunction (5)); //出错
function factorial (num){
if(num <= 1){
return 1;
}else{
return num * arguments.callee(num-1);
}
}
但是在
严格模式下,是不允许脚本访问arguments.callee属性的,但是
可以通过命名函数表达式来做到相同的结果.
var factorial = (function f(num){
if(num <= 1)return 1;
else return mun * f(num-1);
});
创建了一个f()的命名函数表达式,这样在严格和非严格模式下都可以。
ECMAScript的函数名本身就是变量,所以函数可以作为值来使用,不仅可以像传递参数一样将一个函数传递给另一个函数, 而且可以将一个函数作为另一个函数的返回结果。
一个例子:
function f(){
var result = new Array();
for(var i = 0; i< 10; i++){
result[i] = function(){
return i;
};
}
return result;
}
var a = f();
for(var i = 0; i<10;i++){
console.log("a["+i+"]() = "+ a[i]());
}
//打出来的值全是10;
function f(){
var result = new Array();
for(var i = 0; i< 10; i++){
result[i] = function(num){
//每个函数都有自己num变量的一个副本
return function(){
return num;
};
}(i);
}
return result;
}
var a = f();
for(var i = 0; i<10;i++){
console.log("a["+i+"]() = "+ a[i]());
}
因此就能够返回各自不同的数值了。
var name = "window";
var a = {
name : "a",
getName : function(){
return function(){
return this.name;
};
}
};
alert(a.getName()()); //window
var name = "window";
var a = {
name : "a",
getName : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(a.getName()()); //a
(function(){
// 这里是块级作用域
})();
可以这样来理解,
var f = function(){
};
f();
function(){
}();
(function(){
// 这里是块级作用域
})();