// 匿名函數就是沒有名字的函數,也稱拉姆達函數(lambda),功能強大
// 經典函數聲明
function functionName(arg0, arg1, arg2)
{
// 函數體
}
// 以函數表達式的形式定義函數(即匿名函數)
var functionName = function(arg0, arg1, arg2){
// 函數體
};
// 如下 test() 就返回一個匿名函數
function test(pn)
{
return function(obj1, obj2)
{
var v1 = obj1[pn];
var v2 = obj2[pn];
if(v1 < v2)
{
return -1;
} else if (v1 > v2)
{
return 1;
}else
{
return 0;
}
}
}
// 閉包:是指有權訪問另外一個函數做用域中的變量的函數。建立閉包的常見方式,就是在一個函數內部建立另外一個函數
function test(pn)
{
// 如下是匿名函數
return function(obj1, obj2)
{
var v1 = obj1[pn]; // 訪問了外部函數中的變量 pn
var v2 = obj2[pn]; // 訪問了外部函數中的變量 pn
if(v1 < v2)
{
return -1;
} else if (v1 > v2)
{
return 1;
}else
{
return 0;
}
}
}
// 即便這個內部函數被返回了,並且是在其它地方被調用了,但它仍然能夠訪問變量 pn。之因此還能訪問這個變量,是由於內部函數的做用域鏈中包含 test() 的做用域。是這由於:當某個函數第一次被調用時,會建立一個執行環境及相應的做用域鏈,並把做用域鏈賦值給一個特殊的內部屬性([scope]).而後使用 this,arguments 和其它命名參數的值來初始化函數的活動對象(activation object)。但做用域鏈中,外部函數的活動對象始終處於第二位,外部函數的外部函數的活動對象處於第三位……。直到做爲做用域鏈終點的全局執行環境。在函數執行過程當中,爲讀取和寫入變量的值,就須要在做用域鏈中查找變量
function compare(value1, value2)
{
if(value1 < value2)
{
return -1;
}else if(value1 > value2)
{
return 1;
}else
{
return 0;
}
}
var result = compare(5, 10);
// 以上代碼先定義了 compare() 函數,而後又在全局做用域中調用了它。當第一次調用 compare() 時,會建立一個包含 this,arguments,value1, value2 的活動對象。全局執行環境的變量對象(包含 this, result, compare)在compare()執行環境的做用域鏈中則處於第二位。閉包