2008-09-22 29 views
12

Với một số mã JS như thế ai ở đây:Các cuộc gọi hàm JS tốn bao nhiêu (so với cấp phát bộ nhớ cho một biến)?

for (var i = 0; i < document.getElementsByName('scale_select').length; i++) { 
    document.getElementsByName('scale_select')[i].onclick = vSetScale; 
    } 

có mã được nhanh hơn nếu chúng ta đặt kết quả của getElementsByName vào một biến trước khi vòng lặp và sau đó sử dụng các biến sau đó?

Tôi không chắc chắn ảnh hưởng lớn như thế nào trong cuộc sống thực, với kết quả từ getElementsByName thường có < 10 mục. Tôi vẫn muốn hiểu cơ chế cơ bản.

Ngoài ra, nếu có điều gì đáng chú ý khác về hai tùy chọn, vui lòng cho tôi biết.

Trả lời

17

Chắc chắn. Bộ nhớ cần thiết để lưu trữ sẽ chỉ là một con trỏ đến đối tượng DOM và đó là đáng kể ít đau đớn hơn so với thực hiện tìm kiếm DOM mỗi lần bạn cần sử dụng thứ gì đó!

đang Idealish:

var scale_select = document.getElementsByName('scale_select'); 
for (var i = 0; i < scale_select.length; i++) 
    scale_select[i].onclick = vSetScale; 
+0

Cảm ơn bạn đã rất chính xác! –

+1

Và nếu bạn lo lắng về chi phí bộ nhớ dài hạn, bạn có thể giải phóng biến: scale_select = null; – Oli

+1

"delete scale_select" cũng sẽ xóa nó - cộng với nó rõ ràng hơn ý định của bạn là gì. – nickf

1

Về nguyên tắc, mã sẽ nhanh hơn nếu chúng ta đặt kết quả của getElementsByName vào một biến trước vòng lặp và sau đó sử dụng biến sau đó?

có.

0

Tôi nghĩ vậy. Mỗi khi nó lặp lại, động cơ cần phải đánh giá lại câu lệnh document.getElementsByName.

Mặt khác, nếu giá trị được lưu trong một biến, thì giá trị đó sẽ có giá trị.

1

Sử dụng biến. Họ không phải là rất tốn kém trong JavaScript và các cuộc gọi chức năng chắc chắn là chậm hơn. Nếu bạn lặp lại ít nhất 5 lần so với document.getElementById(), hãy sử dụng một biến. Ý tưởng ở đây không chỉ là chức năng gọi là chậm nhưng chức năng cụ thể này là rất chậm vì nó cố gắng xác định vị trí các yếu tố với id nhất định trong DOM.

+1

Làm cách nào bạn đưa ra 5 là số ma thuật? –

3

Việc triển khai thông minh DOM sẽ thực hiện bộ nhớ đệm của riêng nó, làm mất hiệu lực bộ nhớ cache khi có gì đó thay đổi. Nhưng không phải tất cả các DOM ngày nay có thể được tính là thông minh này (ho IE ho) vì vậy tốt nhất là bạn tự làm điều này.

4

Caching tra cứu bất động sản có thể giúp một số người, nhưng phương án c aching the length of the array before starting the loop has proven to be faster.

Vì vậy, khai báo một biến trong vòng lặp chứa giá trị của scale_select.length sẽ tăng tốc độ toàn bộ vòng một.

var scale_select = document.getElementsByName('scale_select'); 
for (var i = 0, al=scale_select.length; i < al; i++) 
    scale_select[i].onclick = vSetScale; 
1

@ Oli

Caching thuộc tính chiều dài của các yếu tố lấy trong một biến cũng là một ý tưởng tốt:

var scaleSelect = document.getElementsByName('scale_select'); 
var scaleSelectLength = scaleSelect.length; 

for (var i = 0; i < scaleSelectLength; i += 1) 
{ 
    // scaleSelect[i] 
} 
1

Không có điểm lưu trữ các scaleSelect.length trong một riêng biệt biến; nó thực sự đã có trong một - scaleSelect.length chỉ là một thuộc tính của mảng scaleSelect, và như vậy nó nhanh chóng truy cập như bất kỳ biến tĩnh nào khác.

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