2016-03-06 16 views

Trả lời

11

Ví dụ một chức năng bất tịnh có tác dụng phụ trên biến ngoài phạm vi của chính nó:

var count = 0; 

function increaseCount(val) { 
    count += val; 
} 

Hoặc một hàm trả về giá trị khác nhau cho cùng một đầu vào bởi vì nó đánh giá một biến mà không được cho là tham số:

var count = 0; 

function getSomething() { 
    return count > 0; 
} 
+0

Tôi thích ví dụ này như thế này hiện đang là cạm bẫy lớn nhất của tôi. Tôi là tất cả cho API như JavaScript gọi (giữ chức năng tinh khiết), tuy nhiên, tôi cũng cho sử dụng JavaScript với OOP trong tâm trí, trong đó có thể bao gồm các chức năng không tinh khiết như MyStringClass.length(). –

+0

Ý tưởng đằng sau các hàm thuần túy là không sử dụng OOP. Nếu bạn muốn xây dựng một "lớp" giữ trạng thái, bạn sẽ luôn luôn có các hàm không tinh khiết. Nhưng miễn là họ là tất cả các phần của cùng một "lớp" này là sự cân bằng bạn phải thực hiện cho OOP. – migg

0

Ví dụ tôi có thể nghĩ (thực sự khá khó hiểu) là Array#reverse(). Thay vì trả về một mảng mới, nó thay đổi nó tại chỗ trong khi trả về mảng ban đầu.

Một số chức năng mảng khác làm điều này là tốt, chẳng hạn như splice, push, shift, pop, unshift.

0

pure chức năng (lấy đối số và trả lại giá trị mới):

function (objectArgument) { 
    return { 
     value: objectArgument.value + 123, 
     // other arguments 
    }; 
} 

impure chức năng (được lập luận, sửa đổi nó và trở về đối tượng sửa đổi):

function (objectArgument) { 
    objectArgument.value += 123; 
    return objectArgument; 
} 
0
  1. không tinh khiết functon là một hàm trả về kết quả khác nhau cho thông số đầu vào tương tự, đó là để nói rằng nó phụ thuộc vào một số trạng thái;
  2. Chức năng có thể trả về cùng một kết quả cho cùng một thông số đầu vào, nhưng rằng biến đổi đối tượng trạng thái khác. phản đối rằng nó không phụ thuộc nhưng những người khác làm // gây tác dụng phụ

dụ:

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 
2

Math.random() là một chức năng bất tịnh; nó thay đổi trạng thái bên trong của đối tượng Math để bạn nhận được các giá trị khác nhau về các cuộc gọi liên tiếp. console.log()alert() là các hàm không tinh khiết vì chúng có các tác dụng phụ (mặc dù chúng tạo ra cùng một hành vi và luôn trả về cùng một giá trị cho các cuộc gọi giống nhau).

Bất kỳ chức năng nào thay đổi trạng thái bên trong của một trong các đối số của nó hoặc giá trị của một số biến bên ngoài là một hàm không tinh khiết.

Bạn lấy ý tưởng cho rằng chức năng không tinh khiết ở đâu luôn được coi là điều xấu?

+0

Cách 'console.log()' là hàm không tinh khiết? Bạn có thể vui lòng cho một số ý tưởng? – Sourav

+0

@Sourav - tôi đã giải thích lý do tại sao: mỗi cuộc gọi cho 'console.log()' có một tác dụng phụ (đặc biệt, sản lượng mà nó ghi vào giao diện điều khiển). Bất kỳ cuộc gọi hàm nào tạo ra đầu ra, theo định nghĩa, một hàm không tinh khiết. (Xem, ví dụ, [bài viết Wikipedia _Pure function_] (https://en.wikipedia.org/wiki/Pure_function).) –

4

Chức năng thuần túy không phụ thuộc vào và không sửa đổi trạng thái biến trong phạm vi của nó.

Cụ thể, điều đó có nghĩa là hàm thuần túy luôn trả về cùng một kết quả cho cùng một tham số. Việc thực thi của nó không phụ thuộc vào trạng thái của hệ thống.

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. 

Ở đây chúng tôi sửa đổi các thuộc tính của đối tượng đã cho. Do đó chúng ta sửa đổi đối tượng nằm ngoài phạm vi chức năng của chúng ta: hàm này là không tinh khiết.

var values = { a: 1 }; 

function pureFunction (a) { 
    var b = 1; 

    a = a * b + 2; 

    return a; 
} 

var c = pureFunction(values.a); 

chúng tôi chỉ cần sửa đổi thông số nằm trong phạm vi chức năng, không có gì được sửa đổi bên ngoài!

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. 

Ở đây, b không nằm trong phạm vi chức năng. Kết quả sẽ phụ thuộc vào bối cảnh: bất ngờ được mong đợi!

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`. 

tham khảo: For more details, click here