2011-08-24 27 views
9

Tôi nhận ra rằng nó rất hữu ích (vì lý do hiệu suất) để làm một cái gì đó giống như ...Điểm phân công lại các biến đối số là gì?

function Abc(a, b, c) { 
    var window = window; 

Vì vậy, khi các mã truy cập window, nó không cần phải đi lên chuỗi phạm vi để cuối cùng tìm window. Điều tương tự cũng có thể được thực hiện cho document, navigator, vv ...

Nhưng tôi trong quá trình viết lại một số các MobiScroll jQuery plugin và thấy điều này ...

function Scroller(elm, dw, settings) { 
    ... 
    var elm = elm; 
    var dw = dw; 
    ... 

những ưu điểm của reinitialising là gì elmdw để trỏ đến các biến đối số của chúng?

Tôi đã đọc rất nhiều về việc truy cập arguments là tốn kém, nhưng không bao giờ đọc bất cứ điều gì về lý do tại sao điều này có thể là thực hành tốt.

Lợi ích khi thực hiện việc này là gì?

Trước đây, tôi đã deliberately removed cấu trúc này từ tài liệu MDN.

+0

Không bao giờ nhìn thấy nó. Hãy để động cơ lo lắng về "tối ưu hóa". –

+0

@pst Tôi đồng ý. Tuy nhiên, tôi có một tâm trí tò mò ... – alex

+1

Nó nhiều hơn hoặc ít hơn một bản sao của [Javascript - Tôi có cần phải sử dụng 'var' khi gán lại một biến được định nghĩa trong các tham số của hàm?] (Http://stackoverflow.com/questions/2495174/javascript-do-i-need -to-use-var-khi-reassigning-a-biến-được định nghĩa-in-the-fu). Tuy nhiên, tôi không biết đây có phải là câu trả lời bạn muốn hay không. –

Trả lời

2
> function Abc(a, b, c) { 
>  var window = window; 

Vì vậy, khi các mã truy cập cửa sổ, nó không cần phải đi lên chuỗi phạm vi để cuối cùng tìm thấy cửa sổ.

Tôi không nghĩ đó là lý do. Đối với một hàm được khai báo trong phạm vi toàn cục, việc giải quyết một số nhận dạng cục bộ so với toàn cầu sẽ không đáng kể nhanh hơn (và có thể chậm hơn tùy thuộc vào trình duyệt).

Scripts có thể sử dụng một cái gì đó tương tự như trên để đảm bảo cửa sổ đề cập đến dự kiến ​​cửa sổ đối tượng và không phải một số cửa sổ khác trên chuỗi phạm vi, ví dụ

var fn = (function(window) { 

    // In here window is unequivocally a reference to the global object 

}(this)); 

Trong ví dụ thứ hai:

> function Scroller(elm, dw, settings) { 
>  ... 
>  var elm = elm; 
>  var dw = dw; 
>  ... 

Tuyên bố các biến là hoàn toàn phí thời gian. Đặt một số nhận dạng trong danh sách tham số chính thức của một khai báo hàm hoặc biểu thức tương đương với khai báo nó là localling với var. Khai báo các mã định danh như các biến cục bộ không có tác dụng gì cả.

Đã có phiên bản Safari sớm có vấn đề với thông số chính thức không được chuyển một giá trị, nhưng đó là một thời gian dài trước đây và chỉ là vấn đề trong một trường hợp rất cụ thể.

+0

+1 cảm ơn RobG, đây là một câu trả lời tuyệt vời. – alex

+2

Về phần đầu của câu trả lời: Có, đối với các chức năng toàn cầu, sẽ không có sự khác biệt lớn. Nhưng các chức năng thường được lồng trong các chức năng khác, được sử dụng như callbacks vv và có ý nghĩa để có được bất kỳ đối tượng nào gần nhất có thể. Nó cũng phụ thuộc vào * mức độ thường xuyên * một đối tượng nhất định được truy cập. Quy tắc chung là, nếu bạn truy cập một thuộc tính hoặc đối tượng nhiều lần, hãy lưu trữ nó trong một biến cục bộ. –

+0

@Felix King Tôi không sử dụng quy tắc chung đó - quy tắc chung của tôi là "... nếu nó làm cho mã dễ đọc hơn/có thể bảo trì được thì ..." có * không có gì * để thực hiện với "hiệu suất "hoặc" đếm ". –

0

Lý do hợp lý duy nhất là khả năng làm rõ phạm vi biến được khai báo.

Sau đó, nó chỉ thêm mã dư thừa.

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