2015-08-08 15 views
5

Hãy xem xét ví dụ này đơn giản:Tại sao JSLint cấm từ khóa "này"?

"use strict"; 
var Foo = { 
    field: 0, 
    func: function() { 
     this.field = 4; 
    } 
} 

JSLint ném lỗi:

Unexpected 'this'. At the line "this.field = 4".

tôi đã dường như một số câu hỏi ở đây trong StackOverflow yêu cầu này, và trong tất cả các trường hợp, câu trả lời là chỉ để bật cờ "Dung thứ này". Tuy nhiên, tôi quan tâm đến lý do tại sao những người sáng tạo JSLint nghĩ rằng việc sử dụng "điều này" là (hoặc có thể dẫn đến) một lỗi.

Ngoài ra, làm cách nào để triển khai các chức năng của thành viên mà không có từ khóa "này" và không mong đợi người dùng chuyển đối tượng đó làm đối số đầu tiên?

EDIT Có lẽ tôi đã không làm cho bản thân mình đủ rõ ràng trong đó câu hỏi này, mặc dù tìm kiếm tương tự không có một câu trả lời cho những gì tôi đang hỏi: JSLint Error: Unexpected 'this'

Vấn đề với câu hỏi đó không phải là câu hỏi chính nó mà đúng hơn là câu trả lời. Lưu ý cách câu trả lời được chấp nhận là: "Đề xuất của tôi là: yêu cầu JSLint tắt". Và tôi đặc biệt nói trong bài viết của tôi rằng đây không phải là câu trả lời hợp lệ cho tôi, vì tôi muốn hiểu tại sao việc sử dụng điều này bị JSLint cấm, không phải cách để tránh lỗi đó.

+0

Chỉ cần lưu ý, JSLint không chỉ cấm những thứ có thể dẫn đến lỗi. Nó "buộc" bạn sử dụng một kiểu mã hóa cụ thể. – meskobalazs

+2

Tôi muốn lưu ý rằng tôi đặc biệt đề cập đến trong câu hỏi của mình rằng nó khác với câu hỏi tôi đang "sao chép", mặc dù không trích dẫn cụ thể liên kết. Cụ thể khi tôi nói: "Tôi đã có một số câu hỏi ở đây trong StackOverflow yêu cầu điều này, và trong tất cả các trường hợp, câu trả lời chỉ là để cho phép" khoan dung này "cờ." Tôi đang đề cập đến câu hỏi đó, trong số những câu hỏi khác.Lưu ý rằng câu trả lời được chấp nhận trong câu hỏi đó không được chấp nhận theo quan điểm của tôi, vì việc vô hiệu hóa lỗi không giải thích nguyên nhân gây ra lỗi đó và tại sao nó lại gây ra. – Setzer22

+0

@meskobalazs, Điều cần biết. Tuy nhiên, tôi đang hấp dẫn những gì là "tốt" phong cách mã hóa tránh "này" và tại sao điều này rõ ràng là sử dụng đúng đắn của từ khóa "này" thiếu sót theo JSLint. – Setzer22

Trả lời

2

Như @pdenes chỉ ra trong các ý kiến, đã có một số cuộc thảo luận về chủ đề ở đây: https://plus.google.com/communities/104441363299760713736/s/Berriman%20new%20version%20fails

Ngoài ra còn có một Douglas Crockford youtube talk called "The Better Parts" trong đó Douglas cho thấy một số ý kiến ​​của mình về vấn đề này, và đề xuất một (theo ý kiến ​​của mình) cách tốt hơn để tạo một hàm tạo.

Các mô hình xây dựng đề xuất trông như thế này (lấy trực tiếp từ buổi nói chuyện, nó cũng cho thấy một số tính năng của ES6):

function constructor(specs) { 
    let {member} = spec, 
     {other} = other_constructor(spec), 
     method = function() { 

     }; 
    return Object.freeze({ 
     method, 
     other 
    }); 
} 

Các "mẫu", như tôi hiểu nó, là để tránh sử dụng "này "và bất kỳ cách nào khác để tạo đối tượng (bằng phương tiện mới hoặc Object.create), cũng thoát khỏi sự thừa kế nguyên mẫu.

Tại thời điểm này, hàm tạo hiện là hàm trả về một đối tượng (trong trường hợp này, được cố định, nhưng không cần thực sự).

Tất cả công cụ "hướng đối tượng" đều được lưu trữ bằng cách lưu trữ các thành viên và phương thức trong phần đóng của nhà xây dựng, và chức năng thành viên có thể tham chiếu đến tên bởi vì chúng hiện diện trong phạm vi hiện tại. Điều đó thành công tránh việc sử dụng "điều này".

Đáng buồn thay, câu trả lời thực sự tôi nhận được từ điều này là có nhiều cách phức tạp để tạo ra một đối tượng trong javascript, và IMO mỗi một có lỗi của nó. JSLint là một công cụ tốt, nhưng không ai nên theo dõi nó mà không làm một số nghiên cứu và hiểu biết tại sao những lỗi đó được đưa ra. Đặc biệt là khi không có lý do thực sự, toàn diện được cung cấp. Thậm chí không phải bởi tác giả.

+0

Đó là câu trả lời hay. Đó là chắc chắn công bằng để chấp nhận câu trả lời của riêng bạn ở đây để chúng tôi có thể vượt qua nó ra khỏi hồ bơi chưa được trả lời JSLint. Trên thực tế, tốt hơn là xóa bài đăng này và đăng câu trả lời của bạn ở câu hỏi khác. Tôi đã không xem video đó khi [tôi trả lời ở đó] (http://stackoverflow.com/a/30375300/1028230). Câu trả lời của bạn sẽ hữu ích. Tôi hiểu vùng đồng bằng giữa "tránh" và "hiểu" bạn đang tạo ra, nhưng nó hữu ích để giúp mọi người hiểu được ai có thể tránh né một cách vô thức. (Cá nhân, tôi không hiểu làm thế nào bất kỳ câu trả lời JSLint có thể là "không sử dụng JSLint", và điều đó xảy ra quá thường xuyên.) – ruffin

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