2012-02-21 27 views
6

Tất cả,JSLint - Không làm biến đổi tham số <x> khi sử dụng 'đối số'?

Tôi sử dụng JSLint để xác thực tệp JS của mình. Trong dự án gần đây nhất của tôi, tôi đang sử dụng định dạng sau để thiết lập các giá trị mặc định cho một số chức năng Javascript (thêm chi tiết here):

function(a, b, option) { 
    option = arguments.length > 2 ? option : "some default value"; 
    // ... 
} 

Tuy nhiên điều này làm cho build mới nhất của JSLint để sản xuất các lỗi sau:

"Do not mutate parameter 'option' when using 'arguments'." 

Tôi biết rằng việc sử dụng phương pháp phổ biến hơn để gán giá trị mặc định (ví dụ: option = option || {};) sẽ làm giảm lỗi; tuy nhiên, điều này sẽ tạo ra hành vi không chính xác nếu tôi định chuyển giá trị falsey tới option.

Giải pháp duy nhất cho vấn đề này có giới thiệu một biến mới không? ví dụ:

var option2 = arguments.length > 2 ? option : "some default value"; 
+0

Một biến địa phương, đó là bạn "giới thiệu một tham số thứ hai" là một giải pháp tốt hơn. – Biswanath

Trả lời

6

Tôi đoán JSLint cảnh báo bạn vì bạn cố sửa đổi một trong các đối số đầu vào bằng cách sử dụng dấu kiểm với từ khóa đối số. Tuy nhiên, JSHint không cho tôi bất kỳ cảnh báo nào khi thử mã của bạn.

Một giải pháp cho vấn đề của bạn sẽ được kiểm tra xem option được định nghĩa hay không, mà cách bạn đi xung quanh các vấn đề với việc gửi các giá trị falsy:

function(a, b, option) { 
    if(typeof option === "undefined") { 
     option = "some default value"; 
    } 
    // ... 
} 

Nếu bạn thấy rằng nó là cồng kềnh để viết này typeof kiểm tra mọi lúc, tạo ra một isDef chức năng:

function isDef(param) { 
    return typeof param !== "undefined"; 
} 
function(a, b, option) { 
    option = isDef(option) ? option : "some default value"; 
    // ... 
} 

// Simon A.

+0

Cảm ơn đề xuất - xóa nguy cơ chỉ định giá trị không chính xác cho 'arguments.length' là một dấu cộng lớn. Thật không may, bằng cách sử dụng phương pháp này gây ra JSLint để sản xuất cùng một lỗi. – robyaw

+0

Bạn có chắc chắn không? JSLint không phàn nàn khi tôi chạy hai đoạn mã ở trên. –

+0

Hóa ra cả hai chúng ta đều có thể đúng, tùy thuộc vào tình huống. Trong mã của tôi, tôi có một hàm với hai tham số yêu cầu đặt mặc định. Tôi đã sử dụng giải pháp của bạn chỉ trên một trong những đầu tiên (cho mục đích thử nghiệm), để lại thứ hai vẫn còn sử dụng biến 'arguments'. Điều này làm cho JSLint tăng lỗi chống lại * cả hai tham số - rất lạ! – robyaw

1

Trong hầu hết các tình huống s bạn muốn được tốt hơn off chỉ thực hiện:

function(a, b, option) { 
    option = option || "some default value"; 
    // ... 
} 

hoặc

function(a, b, option) { 
    if (!option || typeof option !== 'string') { 
     option = "some default value"; 
    } 
    // ... 
} 
Các vấn đề liên quan