Sau khi nhìn thấy rất nhiều hàm thuần túy và cách chúng không có tác dụng phụ, điều gì sẽ là một ví dụ về hàm không tinh khiết, luôn luôn bị phản đối là nguồn lỗi không ổn định và chính ?Ví dụ về hàm không tinh khiết trong JavaScript
Trả lời
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;
}
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
.
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;
}
- 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;
- 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
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()
và 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?
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
@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).) –
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
- 1. JavaScript - ví dụ về hàm reduce()
- 2. Ví dụ về thời gian khó hiểu javascript Ví dụ
- 3. Gọi hàm javascript tinh khiết từ Angular 2 component
- 4. Ví dụ về toán tử ternary JavaScript với hàm
- 5. các hàm tinh khiết/const trong C++ 0x
- 6. Câu hỏi về phương pháp [Tinh khiết]
- 7. Câu hỏi về destructor ảo tinh khiết
- 8. Ví dụ về Đăng nhập Javascript Facebook
- 9. Ví dụ về thiết kế JavaScript API
- 10. Arduino trong tinh khiết C
- 11. python tinh khiết ssh
- 12. Ví dụ đơn giản về hàm javascript không đồng bộ là gì?
- 13. Ví dụ về biến đổ bóng trong javascript
- 14. Quá tải chức năng ảo tinh khiết
- 15. Ví dụ về O (n!)?
- 16. Kiểm tra nếu Generic Giao diện Thành viên là "tinh khiết" (có thuộc tính tinh khiết)
- 17. Ví dụ về JGraphT
- 18. wxPython Ví dụ về WebView
- 19. Ví dụ đối tượng mới Javascript từ tên hàm động
- 20. Ví dụ về pysmb
- 21. Ví dụ về Winsock?
- 22. Ví dụ về MultiSelectListPreference
- 23. Ví dụ về D.ccurl
- 24. Ví dụ về array.map() trong C#?
- 25. tinh khiết destructor ảo trong C++
- 26. Blocks trong ERB tinh khiết/Erubis
- 27. Ví dụ về jQuery & history.js
- 28. Ví dụ về Android SSLEngine
- 29. Ví dụ mã hóa JavaScript
- 30. Ví dụ về các ví dụ điển hình
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(). –
Ý 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