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

閉包(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表達式就是匿名函數。less

而閉包(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()()

因此兩個是不相同可是相關的概念,總結來講:code

  • lambda是沒有名字的函數,等價於匿名函數
  • 閉包是做用域閉合於外部函數環境的函數
相關文章
相關標籤/搜索