首先要有一個概念:并不是一個語言支持函數,這個語言就可以叫做“函數式語言”。函數式語言中的函數(function),除了能被調用之外,還具有一些其他性質。有以下三點:
1. 函數是運算元
2. 在函數內保存數據
3. 函數內的運算對函數外無副作用
一、函數是運算元
普通的函數調用時,可以抽象的理解為:函數就是一個運算符,傳入的參數是運算元;
但當JavaScript中的函數作為另一個函數的參數使用時,是傳遞引用的,這個“傳入參數”就可以被理解為是一個運算元。由此的結論是,(作為“傳入參數”的)函數具有運算元的含義,“函數參數”與普通參數并沒有什么不同。
二、在函數內保存數據
在命令式語言中,函數內部的私有變量(局部變量)是不能被保存的。從程序的執行方式上來講,局部變量在棧上分配,在函數執行結束后,所占用的棧被釋放。因此函數內的數據不可能被保存。
在JavaScript的函數中,函數內的私有變量可以被修改,而且當再次“進入”到該函數內部時,這個被修改的狀態仍將持續。下面的例子說明了這個特性:
function set_value(v){
value = v;
}
function get_value(){
return value;
}
set = set_value;
get = get_value;
}
MyFunc();
console.log(get()); //100
set(300);
console.log(get()); //300
obj2.setValue(300);
obj1.showValue(); //100;
這樣的函數在運算過程中對外部系統是無副作用的。然而我們注意到,JavaScript允許在函數內部引用和修改全局變量,甚至可以聲明全局變量。這一點其實是破壞它的函數式特性的。
除此之外,JavaScript也允許在函數內修改對象和數組成員――――這些成員應該由對象方法而非對象系統外的其他函數來修改。
所以:JavaScript這項特性只能通過開發人員的編程習慣來保證。
新聞熱點
疑難解答