2015-07-02 17 views
6

Tôi mới làm quen với lập trình javascript (và ngôn ngữ kịch bản nói chung), nhưng tôi đã sử dụng JS Lint để giúp tôi khi tôi tạo lỗi cú pháp hoặc vô tình khai báo biến toàn cục.Tôi có thể ngăn không cho chuyển số tham số sai đến các phương thức có JS Lint, JS Gợi ý hay một số công cụ khác không?

Tuy nhiên, có một kịch bản mà JS Lint không đề cập đến, điều tôi cảm thấy sẽ vô cùng tiện lợi. Xem mã bên dưới:

(function() { 
    "use strict"; 
    /*global alert */ 

    var testFunction = function (someMessage) { 
     alert("stuff is happening: " + someMessage); 
    }; 

    testFunction(1, 2); 
    testFunction(); 
}()); 

Lưu ý rằng tôi đang chuyển sai số tham số đến hàm testFunction. Tôi không thấy trước bản thân mình trong một tình huống mà tôi cố tình bỏ qua một tham số hoặc thêm một thông số như thế. Tuy nhiên, cả JS Lint lẫn JS Hint đều không coi đây là lỗi.

Có công cụ nào khác có thể bắt được điều này cho tôi không? Hoặc là có một số lý do tại sao đi qua các thông số như thế không nên kiểm tra lỗi?

+0

Địa điểm này gần với những gì bạn đang hỏi? https://jslinterrors.com/this-function-has-too-many-parameters –

+0

Không.Điều đó có vẻ là một giới hạn về số lượng tham số mà hàm có thể có. Tôi không đặc biệt quan tâm về chức năng có 2 hoặc 7 tham số. Tôi chỉ không muốn gọi một hàm có 2 tham số với cuộc gọi đi qua số 7. – tandersen

+0

Vì vậy, bạn muốn có một giải pháp chung khác ngoài việc đánh dấu mọi hàm với giá trị tùy chỉnh như min = 3 và max = 3 cho 3 chức năng tham số. Tôi chưa thấy quy tắc lint như vậy. –

Trả lời

3

Điều này thường không thể thực hiện được với bất kỳ công cụ phân tích tĩnh nào. Có một vài lý do cho việc này:

  • Nói chung, các hàm JS có thể chấp nhận bất kỳ số đối số nào.
  • Phần lớn (tất cả?) Linters chỉ hoạt động trên một tệp duy nhất tại một thời điểm. Họ không biết gì về các hàm được khai báo trong các tệp khác
  • Không có gì đảm bảo rằng thuộc tính được gọi là hàm là hàm mà bạn mong đợi. Hãy xem xét đoạn mã này:

    var obj = { myFunc : function(a,b) { ... } }; 
    var doSomething(x) { x.myFunc = function(a) { ... }; }; 
    doSomething(obj); 
    obj.myFunc(); 
    

Không có cách nào để biết rằng myFunc bây giờ có một số khác nhau của args sau khi cuộc gọi đến doSomething.

JavaScript là ngôn ngữ động và bạn nên chấp nhận và chấp nhận điều đó.

Thay vì dựa vào linting để bắt các vấn đề mà nó không được dự định tôi sẽ khuyên bạn nên thêm tiền tố vào chức năng của bạn mà không kiểm tra.

Tạo một hàm helper như thế này:

function checkThat(expression, message) { 
    if (!expression) { 
    throw new Error(message); 
    } 
} 

Sau đó sử dụng nó như thế này:

function myFunc(a, b) { 
    checkThat(arguments.length === 2, "Wrong number of arguments."); 

Và với kiểm tra đơn vị thích hợp, bạn không bao giờ nên thấy thông báo lỗi này trong sản xuất.

1

Điều này không thể thực hiện được trong javascript. Bạn sẽ phải làm một cái gì đó như thế này:

var testFunction = function (someMessage) { 
    var args = Array.prototype.slice.call(arguments); 
    if (args.length !== 1) throw new Error ("Wrong number of arguments"); 
    if (typeof args[1] !== string) throw new Error ("Must pass a string"); 
    // continue 
}; 
0

Paul Irish demoed một hack cho điều này trong một thời gian trở lại ... đi undefined ở phần cuối của các thông số ...

var testFunction = function (someMessage, undefined) { 
    alert("stuff is happening: " + someMessage); 
}; 

Ông demo nó here ... xem đó có phải là điều bạn đang tìm kiếm không.

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