2015-05-01 15 views
12

Tôi đã tham gia một cuộc phỏng vấn và tôi có tất cả các câu hỏi ngay bên ngoài câu hỏi này.Làm thế nào tôi có thể viết một hàm cho mod (3) (9)?

Câu hỏi thứ nhất dẫn đến đó là làm thế nào để bạn viết một hàm cho mod(3,9) để nó trả về 0.

Ok, dễ dàng:

function mod(a,b){ 
    return b%a; 
} 

Sau đó là làm thế nào để bạn viết chức năng mod(3)(9) sao cho nó trả về 0?

Tôi đã bị chặn ...

+4

Return một hàm. Kiểm tra các hướng dẫn về các chức năng bậc cao hơn, và currying. Tôi nghĩ bạn có nghĩa là 'mod (3) (9)' – elclanrs

+3

'mod ((3) (9))' --- không phải là một cú pháp JS hợp lệ. Vì vậy, nó không thể viết một chức năng để một cuộc gọi như vậy trả về '0' – zerkms

+1

có vẻ như một câu hỏi phỏng vấn khá ngu ngốc –

Trả lời

17

Bạn viết một hàm trả về kết thúc.

function mod(a) { 
 
    return function(b) { 
 
    return b % a; 
 
    } 
 
} 
 

 
alert(mod(3)(9));

Khái niệm alert là viết tắt của:

var tempfun = mod(3); 
alert(tempfun(9)); 

Khi bạn gọi mod(3), nó sẽ trả về một chức năng mà có một đối b, và thực hiện các mô đun với ràng buộc lưu của a, trong đó có 3. Sau đó chúng ta có thể sử dụng nó theo cùng cách chúng ta sử dụng bất kỳ hàm nào khác: chúng ta có thể gán nó cho một biến và sau đó gọi nó như là một hàm, hoặc chúng ta có thể gọi nó trực tiếp bằng cách đặt một cặp ngoặc đơn khác sau đó.

+1

Tôi đang nghiên cứu sâu hơn về cà ri và các ví dụ đều quá sâu. Tôi muốn hiểu chính xác những gì đang xảy ra ở đây với ví dụ đơn giản này. Tôi nhận ra rằng đó là một hàm trả về một hàm. Nhưng tôi muốn hiểu cách hàm được gọi ra làm việc. mod (3) (9). Tôi đang đọc này như là đối số là "3) (9" kể từ khi các thông số được cho là được bao bọc trong ngoặc đơn.Tôi nhận được rằng suy nghĩ của tôi là sai, do đó, nó thay vì làm mod (3) đầu tiên, trả về chức năng (b), và 9 là bằng cách nào đó được thông qua như b? (làm thế nào điều đó xảy ra), sau đó chức năng (9) trả về 9% 3 .... tiếp tục trong bình luận tiếp theo – sjmartin

+0

phần tôi đang thiếu trong tâm trí của tôi là đọc cú pháp một cách chính xác. đối số thực sự không phải là "3) (9" do đó, nó là gì? chuỗi chức năng? mod (3) sau đó mod (9)? Làm thế nào để biến 9 thành b? Cảm ơn bạn – sjmartin

+2

'var x = mod (3) (9) 'là viết tắt của' var f = mod (3); var x = f (3); '. – Barmar

12

Trước hết, nhìn kỹ vào việc sử dụng xây dựng này:

mod(3)(9); 

Bạn có thể chia nó thành hai bước:

var fn = mod(3); 
fn(9); 

Từ đây là nó rõ ràng rằng mod(3) mình phải trả lại một chức năng mới để sau này nó có thể được gọi lại. Hàm mới này cần bảo toàn giá trị được truyền vào bằng lời gọi đầu tiên. Đây là phần quan trọng: bạn nên lưu trữ giá trị đó trong việc đóng cửa (cũng nó được lưu trữ tự động do bản chất của việc đóng cửa):

function mod(x) { 
    return function(y) { 
     return y % x; 
    }; 
} 

Ở đây có minh hoạ tốt về thuật ngữ "đóng cửa". Nếu ai đó hỏi bạn (ví dụ như trên phỏng vấn) bạn có thể nói: đóng là hàm với phạm vi ban đầu được tạo. Vì vậy, trong hàm ở trên, hàm bên trong mới luôn có quyền truy cập nội bộ tham số hàm ngoài x.

2

Bạn có thể sử dụng một hàm trả về một chức năng

function mod(a) { 
    return function(b) { 
     return b % a; 
    } 
} 
Các vấn đề liên quan