2011-01-14 26 views
5

vì một số lý do tôi làm điều đó mọi lúc bởi vì tôi thấy nó sạch sẽ. Tôi khai báo các biến trên đầu để sử dụng chúng bên dưới. Tôi làm điều đó ngay cả khi tôi chỉ sử dụng chúng một lần.Đó có phải là một thực tiễn Javascript tồi mà tôi đang làm ở đây không?

Dưới đây là một ví dụ (sử dụng jQuery khuôn khổ):

$("#tbListing").delegate("a.btnEdit", "click", function(e) { 
    var storeId = $(this).closest("tr").attr("id").replace("store-", ""), 
     storeName = $(this).closest("tr").find("td:eq(1)").html(), 
     $currentRow = $(this).closest("tr"); 

    $currentRow.addClass("highlight"); 

    $("#dialogStore") 
     .data("mode", "edit") 
     .data("storeId", storeId) 
     .data("storeName", storeName) 
     .dialog("open"); 

    e.preventDefault(); 
}); 

Tôi có xu hướng làm điều đó trong PHP quá. Tôi có đúng không nếu tôi tin rằng nó không phải là rất bộ nhớ hiệu quả để làm điều đó?

Chỉnh sửa: Cảm ơn tất cả các câu trả lời. Bạn có tất cả các câu trả lời tốt. Giới thiệu về tối ưu hóa mã đó ngay bây giờ. Bây giờ có tốt hơn không?

  $("#tbListing").delegate("a.btnEdit", "click", function(e) { 
       var $currentRow = $(this).closest("tr"), 
        storeId = this.rel, /*storing the storeId in the edit button's rel attribute now*/ 
        storeName = $currentRow.find("td:eq(1)").html(); 

       $currentRow.addClass("highlight"); 

       $("#dialogStore") 
        .data("info", { 
         "mode" : "edit", 
         "storeId" : storeId, 
         "storeName" : storeName 
        }) /*can anyone confirm that overusing the data isn't very efficient*/ 
        .dialog("open"); 


       e.preventDefault(); 
      }); 
+1

lặp lại $ (this) .closest ("tr") có thể tránh được) –

+0

Tôi không muốn nhận xét như: Hey bạn đang làm điều đó sai bởi vì bạn lưu trữ thông tin trong các thuộc tính "id" hoặc một cái gì đó hoặc bạn nên lưu trữ thông tin chỉ một lần trong dữ liệu bằng cách sử dụng một đối tượng. Tôi chỉ muốn biết bộ nhớ cho phép của bộ nhớ/trình duyệt làm như thế nào. – Cybrix

+0

@Caspar, yep Tôi biết điều đó. Tôi có thể lưu trữ '$ (this) .closest (" tr ")' trong một biến để jQuery không phải chạy DOM mỗi lần. : P – Cybrix

Trả lời

12

Xin lỗi, bạn có hỏi liệu có thể khai báo biến ngay cả khi bạn đang sử dụng chúng một lần không?

Tuyệt đối! Nó làm cho mã này dễ đọc hơn một triệu lần nếu bạn đặt tên đúng cho một biến. Khả năng đọc nên là mối quan tâm chính của bạn. Hiệu quả bộ nhớ chỉ nên là một mối quan tâm nếu nó chứng minh có vấn đề.

Như Knuth nói,

Chúng ta nên quên đi hiệu quả nhỏ, nói rằng khoảng 97% thời gian: sớm tối ưu hóa là gốc rễ của mọi tội lỗi.

Nếu bạn hỏi thêm về khai báo biến ở đầu hàm, thay vì nơi chúng được sử dụng lần đầu tiên, thì Emmett has it right - Crockford khuyên bạn nên làm điều này trong JavaScript để tránh nhầm lẫn liên quan đến phạm vi. Cho dù nó có giá trị nó trong PHP là một câu hỏi hoàn toàn chủ quan tôi muốn nói, nhưng không có gì sai với việc giữ cho các kiểu mã hóa PHP và JS của bạn giống nhau. hơn


Một CS quote (từ Abelson và Sussman của SICP):

chương trình phải được viết cho mọi người đọc, và chỉ tình cờ cho máy để thực thi.

+1

97% trong thập niên 70. Bây giờ nó là hơn 99,97% –

+0

vì vậy bạn nói rằng bạn chỉ nên lo lắng về hiệu quả bộ nhớ khi nó xảy ra (vì hiệu quả bộ nhớ luôn luôn là vấn đề bởi bản chất của nó), thats nghèo tương lai chống. Chắc chắn khả năng đọc là thứ hai để hoạt động? – benhowdle89

+0

@Marco Điểm rất tốt. – Skilldrick

6

Thực tiễn không tồi.

Câu lệnh var phải là câu lệnh đầu tiên trong nội dung hàm.


JavaScript không có phạm vi khối, để xác định các biến trong khối có thể nhầm lẫn lập trình viên là kinh nghiệm với C ngôn ngữ khác trong gia đình. Xác định tất cả các biến ở hàm trên cùng của hàm.

http://javascript.crockford.com/code.html

+5

Không phải ai cũng đồng ý với mọi điều mà Crockford nói, ít nhất là về điểm đặc biệt này. Tôi chắc chắn không. –

+0

@Tim vậy bạn đề xuất các biến được định nghĩa ở đâu? – Emmett

+0

Eh? Trong đoạn mã ví dụ được đưa ra, câu lệnh 'var' * là * dòng đầu tiên trong phần thân hàm. – Spudley

2

Khai báo các biến ở phía trên là một điều tốt để làm. Nó làm cho mã dễ đọc hơn. Trong ví dụ cụ thể của bạn, bạn có thể thay thế $ (this) .closest ('tr') witha biến, như gợi ý int eh ý kiến, nhưng nói chung tôi tìm thấy mã với tên biến mô tả tất cả ở một nơi rất dễ đọc.

1

nah, tôi muốn nói bạn đang làm chính xác điều đúng.

Như @Caspar nói, bạn có thể đơn giản hóa mã của mình bằng cách đặt $currentRow trước tiên và sử dụng mã đó thay vì $(this).closest("tr") trong hai dòng còn lại. Và có thể có một số thứ khác bạn có thể cải thiện. Nhưng thiết lập vars vào lúc bắt đầu của một chức năng theo cách bạn đã thực hiện nó là hoàn toàn là một điều tốt.

Tốt một phần vì bạn đã thực hiện nó bên trong hàm, do đó, chúng là biến địa phương, có nghĩa là chúng bị vứt bỏ ở cuối hàm, do đó không có vấn đề về sử dụng bộ nhớ ở đó.

Nếu bạn đặt chúng làm vars toàn cầu, nó có thể có nhiều vấn đề hơn, mặc dù thành thật kể cả khi bạn chỉ cần đặt con trỏ tới đối tượng hiện có, nó sẽ không sử dụng số lượng bộ nhớ thậm chí sau đó (mặc dù nó sẽ gây ô nhiễm không gian tên toàn cầu, điều này không tốt)

+0

+1 Cảm ơn bạn, bạn đã xác định rằng chúng bị vứt bỏ sau khi thực thi vì chúng là biến cục bộ. Tôi nghĩ thế nhưng tôi không chắc lắm. – Cybrix

+0

Tôi muốn biết ** một vài điều khác bạn có thể cải thiện **. Tôi đã chỉnh sửa các câu hỏi của mình và đưa vào phiên bản tối ưu hóa (tôi tin) của nó. Tâm trí hãy nhìn vào nó? – Cybrix

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