Dopo aver visto un sacco di funzioni pure e come non hanno effetti collaterali, quale sarebbe un esempio di una funzione impura, che è sempre stata antagonizzata come fonte di errore instabile e principale ?Cosa è un esempio di una funzione impura in JavaScript
risposta
Ad esempio una funzione impura che ha un effetto collaterale su una variabile esterna al proprio ambito:
var count = 0;
function increaseCount(val) {
count += val;
}
Oppure una funzione che restituisce valori diversi per lo stesso input perché valuta una variabile che non è dato come parametro:
var count = 0;
function getSomething() {
return count > 0;
}
Un esempio che posso pensare (che è davvero piuttosto confuso) è Array#reverse()
. Invece di restituire un nuovo array, lo modifica in posizione mentre restituisce l'array originale.
Alcune altre funzioni di array fanno pure, come splice
, push
, shift
, pop
, unshift
.
pure
funzione (ottenere argomento e restituire nuovo valore):
function (objectArgument) {
return {
value: objectArgument.value + 123,
// other arguments
};
}
impure
funzione (ottenere argomentazione, modificato e ritorno oggetto modificato):
function (objectArgument) {
objectArgument.value += 123;
return objectArgument;
}
- impuro functon è una funzione che restituisce risultato diverso per stessi parametri di ingresso, vale a dire che dipende da qualche stato;
- Funzione che può restituire lo stesso risultato per gli stessi parametri di input, ma che muta l'altro oggetto stato. oggetto che non dipende ma altri // provoca effetti collaterali
esempio:
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()
è una funzione impura; cambia lo stato interno dell'oggetto Math
in modo da ottenere valori diversi nelle chiamate successive. console.log()
e alert()
sono funzioni impure perché hanno effetti collaterali (anche se generano lo stesso comportamento e restituiscono sempre lo stesso valore per chiamate identiche).
Qualsiasi funzione che modifichi lo stato interno di uno dei suoi argomenti o il valore di alcune variabili esterne è una funzione impura.
Dove hai avuto l'idea che le funzioni impure sono sempre considerate una cosa negativa?
Come 'console.log()' è una funzione impura? Potresti dare qualche idea? – Sourav
@Sourav - Ho spiegato perché: ogni chiamata a 'console.log()' ha un effetto collaterale (in particolare, l'output che scrive sulla console). Qualsiasi chiamata di funzione che genera output è, per definizione, una funzione impura. (Vedi, ad esempio, [l'articolo di Wikipedia _Pure function_] (https://en.wikipedia.org/wiki/Pure_function).) –
Una funzione pura non dipende e non modifica gli stati delle variabili fuori dal suo ambito.
Concretamente, ciò significa che una funzione pura restituisce sempre lo stesso risultato con gli stessi parametri. La sua esecuzione non dipende dallo stato del sistema.
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.
Qui vengono modificati gli attributi dell'oggetto specificato. Quindi modifichiamo l'oggetto che si trova al di fuori dello scopo della nostra funzione: la funzione è impura.
var values = { a: 1 };
function pureFunction (a) {
var b = 1;
a = a * b + 2;
return a;
}
var c = pureFunction(values.a);
semplicemente modificare il parametro che è nell'ambito della funzione, non viene modificato nulla all'esterno!
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.
Qui, b non rientra nell'ambito della funzione. Il risultato dipenderà dal contesto: sorprese attese!
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`.
Riferimento: For more details, click here
Mi piace questo esempio come questo è attualmente il mio più grande insidia. Sono tutto per API come le chiamate JavaScript (che mantengono le funzioni pure), tuttavia, sono anche per l'utilizzo di JavaScript con OOP in mente, che può includere funzioni impure come MyStringClass.length(). –
L'idea alla base delle funzioni pure è di non utilizzare OOP. Se vuoi costruire una "classe" che mantenga lo stato avrai sempre delle funzioni impure. Ma fintanto che fanno tutti parte della stessa "classe", questo è il compromesso che devi fare per OOP. – migg