閉包(Closure)和匿名函數(Anonymous function)/lambda表達式的區別
函數最常見的形式是具名函數(named function):
function foo(){
console.log("named function")
}
foo()
不過也可以將函數視作數據賦值給變量,這樣的函數可以沒有名字:
nameless = function(){
console.log("anonymouse function")
}
nameless()
上面的function(){...}
就是匿名函數(anonymous function),這個匿名函數也叫做lambda表達式,即lambda表達式就是匿名函數。
而閉包(closure)是作用域在一個環境內閉合的函數,舉個例子:
function outer(){
var a = 10;
function inner(){
console.log(a);
};
return inner;
}
outer()()
這里的inner函數作用域位於outer函數作用域(環境/上下文)內,即閉合於outer環境,這個inner就是閉包。閉包可以具名也可以匿名,上面是具名的形式,可能在很多編程語言無法實現,也可以使用下面的匿名形式:
function outer(){
var a = 10;
return function inner(){
console.log(a);
};
}
outer()()
所以兩個是不相同但是相關的概念,總結來說:
- lambda是沒有名字的函數,等價於匿名函數
- 閉包是作用域閉合於外部函數環境的函數