Cho ví dụ Javascript này tôi tìm thấy
var sum = function() {
var i, sum = 0;
for(i = 0; i < arguments.length; i += 1) {
sum += arguments[i];
}
return sum;
};
Có lợi thế gì trong việc gán một hàm cho một var?
Cho ví dụ Javascript này tôi tìm thấy
var sum = function() {
var i, sum = 0;
for(i = 0; i < arguments.length; i += 1) {
sum += arguments[i];
}
return sum;
};
Có lợi thế gì trong việc gán một hàm cho một var?
Câu trả lời:
Câu trả lời ngắn gọn mà tôi tin chỉ đơn giản là bạn đang tạo một hàm ẩn danh được gán cho một biến, trái ngược với việc tạo một hàm được đặt tên bằng ...
function sum() {}
Một cách tốt để kiểm tra sự khác biệt là gọi .ToString () trên chúng và xem sự khác biệt hoặc bạn có thể thực hiện console.log (sum.name). Một cái sẽ cho một tên thực tế và cái còn lại không có gì, cụ thể là hàm ẩn danh (cái được gán cho var). Cũng có các chi tiết cụ thể, như var sum = function () {} được xác định tại thời gian chạy và hàm sum () {} được xác định tại thời điểm phân tích.
Một lợi thế là bạn không thể sử dụng khai báo hàm trong một khối. Chúng chỉ có thể ở cấp cao nhất của tệp hoặc trực tiếp trong một chức năng khác.
if (true) {
function foo() {}
}
try {
function foo(){}
}
switch (true) {
default:
function foo(){}
}
Tất cả đều không được xác định bởi tiêu chuẩn và các trình duyệt làm những việc khác nhau, xem /programming/10069204/feft-declarations-inside-if-else-statements . Vì vậy, nếu đôi khi bạn phải sử dụng phong cách khác, để thống nhất bạn có thể muốn làm như vậy luôn
Ngoài ra, tôi không chắc chắn về điều này nhưng nếu tôi nhớ chính xác một số công cụ khai thác cũ không đủ thông minh để xử lý các khai báo hàm và không đổi tên chúng.
Tôi không phải là chuyên gia về Javascript, vì vậy hãy dùng nó với một hạt muối. Tôi nghĩ trong một số trường hợp, mọi người có thể làm điều đó cho phong cách và điều tương tự có thể đạt được bằng cách viết "hàm sum () {...}"
Tuy nhiên, việc gán một hàm cho một biến là một kỹ thuật rất mạnh trong lập trình hàm. Nếu bạn quen thuộc với OOP, nó có phần giống với đa hình. Hãy nghĩ về ví dụ kinh điển của lớp cơ sở Động vật và các lớp dẫn xuất Mèo / Chó. Bạn có thể viết mã hoạt động với Animal nhưng khi nó gọi một hàm, hàm đó có thể thực hiện các công việc khác nhau tùy thuộc vào loại của một thể hiện.
Trong lập trình chức năng, bạn có thể có một thuật toán hoạt động với "một hàm" nhưng nếu bạn đang sử dụng một biến để gọi hàm đó, bạn có thể linh hoạt gán một hàm khác trong thời gian chạy.
Ví dụ: giả sử bạn viết một thuật toán để hiển thị 10.000 điểm dữ liệu trong một cửa sổ chỉ có 500 pixel. Mỗi pixel sau đó sẽ đại diện cho 20 điểm dữ liệu và để hiển thị chúng, bạn cần tổng hợp 20 điểm dữ liệu đó thành một giá trị.
Vì vậy, giả sử bạn xác định một thuật toán để trình bày 10.000 điểm và thuật toán này sử dụng một biến hàm gọi là tổng hợp như vậy:
...
displayValue = aggregate( numbersInOnePixel );
...
Bây giờ trong thời gian chạy, người dùng của bạn có thể chọn cách tổng hợp dữ liệu. Biến chức năng thực tế của bạn có thể là một trong những điều sau đây:
aggregate = function sum() {...}
aggregate = function min() {...}
aggregate = function max() {...}
aggregate = function average() {...}
Đây chủ yếu là vấn đề về phong cách, vì các tình huống duy nhất có sự khác biệt xuất hiện (gọi một số hàm trước khi kết thúc tất cả các khai báo; sử dụng phương thức toString) là loại trường hợp góc, theo ý kiến của tôi.
Một trong những đối số tôi đã nghe hỗ trợ var =
phong cách này là nó phù hợp với cách bạn khai báo các biến thông thường. Điều này giới hạn số lượng tính năng ngôn ngữ bạn sử dụng và giúp đơn giản hóa việc giới thiệu chương trình của bạn với người mới sử dụng Javascript.