# 閉包與遞歸函數的區別
閉包函數
閉包是指有權訪問另一個函數作用域中的變量的函數。這個是官方的解釋。閉包其實也是函數,可是不同於其他的函數。它是在函數里面嵌套一個函數的函數,其內部函數引用外部函數的變量、參數。
下面舉個例子來理解:
function outFunction(objName){
return
function(
object
1,
object
2){
var value1 = object1[objName];
var value2 = object2[objName];
if(
value
1 <
value
2){
return -
1;
}
else
if(
value
1 >
value
2){
return
1;
}
else{
return
0;
}
};
}
var compare = outFunction(
"name");
var result = compare({name:
"Nicholas"},{name:
"Greg"});
var value1 = object1[objName];這行代碼訪問了外部函數中的變量objName。內部函數可以訪問外部函數的變量是作用域鏈的問題。
總結一下,形成閉包需要滿足:1)在函數的內部嵌套一個函數;2)內部函數引用了外部函數的變量、參數。
遞歸函數
遞歸函數是在一個函數通過函數名字調用自身的函數。
例如:
function
factorial(
num){
if (
num <=
1) {
return
1;
}
else{
return num * factorial(num - 1);
}
}
console.
log(
factorial(
4)); //
24
閉包與遞歸的區別:
相同點:1)都是函數
2)在函數的內部都會調用函數
不同點: 1)閉包函數調用的內部函數需要引用外部函數的變量、參數;遞歸函數是自己調用自己,不需要引用變量、參數
2)閉包函數調用一次結束調用,遞歸函數在滿足遞歸條件時需要多次調用
3)閉包函數會比其他函數更占內存
