1. 程式人生 > >閉包(Closure)和匿名函數(Anonymous function)/lambda表達式的區別

閉包(Closure)和匿名函數(Anonymous function)/lambda表達式的區別

等價 表達式 編程語言 閉包 lambda ret fun 裏的 編程

閉包(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是沒有名字的函數,等價於匿名函數
  • 閉包是作用域閉合於外部函數環境的函數

閉包(Closure)和匿名函數(Anonymous function)/lambda表達式的區別