2011-12-25 28 views
5

Câu hỏi Javascript noob - một trong những cách sau đây là thực hành tốt nhất và thân thiện với hiệu suất, cũng hoan nghênh mọi đề xuất khác. Đây là phiên bản đơn giản nhất của dự án gốc. Sẽ có hơn 20 biến và 10+ hàm bên trong (Ví dụ: 'process' trong trường hợp).Javascript - Đối số Vs Chức năng lồng nhau Hiệu suất Vs

Ưu điểm của phương pháp 1 là không cần gửi đối số cho hàm nhưng nó giữ tất cả hàm bên trong hàm chính (có thể tạo lại tất cả hàm bên trong cho mỗi thể hiện của Foo). Mặc dù phương thức 2 không có chức năng lồng nhưng đòi hỏi nhiều đối số. Lưu ý rằng cũng sẽ có nhiều cá thể của hàm tạo Foo.

Phương pháp 1:

function Foo() { 
    var a = 1; 
    var b = 2; 
    var c = (a+b)/2; 
    var $element = $('#myElement'); 

    var process = function(){ 
     var x = a+b+c; 
     $element.css('left', x) 
     return x; 
    } 
    x = process(); 
} 

Cách 2:

function Foo() { 
    var a = 1; 
    var b = 2; 
    var c = (a+b)/2; 
    var $element = $('#myElement'); 
    x = process (a, b, c, $element); 
} 

function process (a, b, c, $element){ 
    $element.css('left', x) 
    return x; 
} 

Trả lời

4

Các chức năng tách ra chắc chắn con đường để đi cho hiệu suất. Trong khi có những tình huống mà phạm vi biến của hàm lồng nhau sẽ là tốt đẹp để có, hiệu suất hit có thể rất lớn nếu chức năng là lớn.

Hãy nhớ rằng mỗi khi Foo được gọi, quá trình var sẽ phân bổ lại tất cả bộ nhớ cho hàm mới đang được tạo, thay vì giữ chức năng trong bộ nhớ và chỉ truyền các tham số mới. Nếu chức năng này lớn, đây sẽ là một nhiệm vụ khá căng thẳng cho trình thông dịch Javascript.

Dưới đây là một số con số khó có thể giúp cũng như (Có so sánh hiệu suất và điểm chuẩn thực tế mà bạn có thể chạy trong trình duyệt của bạn): http://jsperf.com/nested-functions-speed, http://jsperf.com/nested-named-functions/5

+0

Có, các hàm được tách riêng có hiệu suất tốt hơn ngay cả với số đối số cao hơn. Cảm ơn câu trả lời. – user1106995

2

Trên thực tế các trình duyệt tối ưu hóa thậm chí chức năng lồng nhau đến nơi khác biệt hiệu suất so các hàm được khai báo trong phạm vi bên ngoài trở nên không đáng kể.

Tôi đã viết blog my findings và tạo một performance test để hỗ trợ xác nhận quyền sở hữu này.

CHỈNH SỬA: Thử nghiệm đã bị hỏng, after fixing kiểm tra cho thấy vẫn không thể lồng hàm nhanh hơn.

+0

Hmm ... chúng hơi tệ hơn một chút, nhưng tôi xem đây là điểm yếu của trình duyệt. Nó đẹp hơn rất nhiều để viết mã lồng nhau! Tôi thích nó! Tôi muốn tất cả các ngôn ngữ được hỗ trợ này, và tối ưu hóa cho điều này khi các biến phi địa phương được sử dụng. – momomo

Các vấn đề liên quan