看過很多純函數以及它們沒有副作用後,什麼是不純函數的例子,它總是被認爲是不穩定和主要的錯誤來源?什麼是JavaScript中不純功能的例子
回答
例如具有不純功能對自己範圍以外的變量有副作用:
var count = 0;
function increaseCount(val) {
count += val;
}
或者說,因爲它的計算結果是不作爲參數給出的變量對於相同的輸入返回不同的值的函數:
var count = 0;
function getSomething() {
return count > 0;
}
我能想到的一個例子(這確實很讓人困惑)是Array#reverse()
。它不是返回一個新數組,而是在返回原始數組的同時對其進行修改。
一些其它陣列功能執行這項作業,如splice
,push
,shift
,pop
,unshift
。
pure
功能(獲取參數和返回新值):
function (objectArgument) {
return {
value: objectArgument.value + 123,
// other arguments
};
}
impure
功能(獲取參數,修改它並返回修改的對象):
function (objectArgument) {
objectArgument.value += 123;
return objectArgument;
}
- 不純functon是其中用於 相同的輸入參數返回不同的結果的函數,也就是說它取決於某個國家;
- 功能可能會返回相同的輸入參數相同的結果,但 變異其他狀態對象。對象,它不取決於但另外一些//會產生副作用
例如:
1)
var toggled = false; /* state */
/*impure function*/
function impureFn(number){
if(number%2 == 0)
toggled = true;
return toggled;
}
/*Execute this in order */
impureFn(5) // returns false
impureFn(2) //returns true
impureFn(5) // now returns true
Math.random()
是不純的功能;它會更改Math
對象的內部狀態,以便在連續調用中獲得不同的值。 console.log()
和alert()
是不純的函數,因爲它們有副作用(雖然它們會產生相同的行爲並始終爲相同的調用返回相同的值)。
任何改變其參數內部狀態或某個外部變量值的函數都是不純的函數。
你從哪裏得到不純的功能總是被認爲是壞事的想法?
'console.log()'是不是不純的函數?你能提出一些想法嗎? – Sourav
@Sourav - 我解釋了爲什麼:每次調用'console.log()'都有副作用(特別是寫入控制檯的輸出)。根據定義,任何生成輸出的函數調用都是不純的函數。 (例如,參見[維基百科文章_純功能_](https://en.wikipedia.org/wiki/Pure_function)。) –
純函數不依賴於它,也不會修改超出其範圍的變量的狀態。
具體而言,這意味着一個純函數總是返回給定相同參數的相同結果。它的執行不依賴於系統的狀態。
var values = { a: 1 };
function impureFunction (items) {
var b = 1;
items.a = items.a * b + 2;
return items.a;
}
var c = impureFunction(values);
// Now `values.a` is 3, the impure function modifies it.
這裏我們修改給定對象的屬性。因此,我們修改位於函數範圍之外的對象:函數不純。
var values = { a: 1 };
function pureFunction (a) {
var b = 1;
a = a * b + 2;
return a;
}
var c = pureFunction(values.a);
我們只是簡單的修改在函數範圍內的參數,外面什麼都不修改!
var values = { a: 1 };
var b = 1;
function impureFunction (a) {
a = a * b + 2;
return a;
}
var c = impureFunction(values.a);
// Actually, the value of `c` will depend on the value of `b`.
// In a bigger codebase, you may forget about that, which may
// surprise you because the result can vary implicitly.
這裏,b不在函數的範圍內。結果將取決於上下文:期望的驚喜!
var values = { a: 1 };
var b = 1;
function pureFunction (a, c) {
a = a * c + 2;
return a;
}
var c = pureFunction(values.a, b);
// Here it's made clear that the value of `c` will depend on
// the value of `b`.
我喜歡這個例子,因爲這是目前我最大的陷阱。我喜歡JavaScript調用API(保持函數純粹),但是,我也在使用帶有OOP的JavaScript,其中可能包括像MyStringClass.length()這樣的不純功能。 –
純函數背後的想法是不使用OOP。如果你想建立一個持有狀態的「類」,你將永遠有不純的功能。但只要它們都屬於同一個「班級」,這就是你必須爲OOP做出的折衷。 – migg