Như những người khác đã nói: "Biến phụ" này (ở một mức độ nào đó) là cách duy nhất để biết thực tế thislà một biểu thức đặc biệt và do đó, không phải là một biến, không bị ràng buộc trong một ngữ cảnh thực thi / đóng.
Tuy nhiên, những gì tôi nghĩ bạn đang hỏi (hoặc những gì tôi thực sự muốn trả lời) là:
Có nên đặt var self = thisở đầu mỗi phương thức / hàm tạo không?
Tóm lược
Trong khi tôi đã thử cách này một lần và có cùng câu hỏi, tôi không còn sử dụng phương pháp này nữa. Bây giờ tôi bảo lưu cấu trúc khi tôi cần truy cập khi đóng. Đối với tôi nó thêm một chút "này, đây là những gì tôi thực sự muốn!" ngữ nghĩa với mã của tôi:
this -> this và self -> this (but really that) in a closure
Câu hỏi ala carte:
... Mặc dù điều này thường được thực hiện, nó cảm thấy hơi sai. Điều tôi hy vọng sẽ tìm thấy trong câu hỏi này là một cách tốt hơn để giải quyết vấn đề này, hoặc một điều gì đó để thuyết phục tôi rằng điều này khá ổn.
Làm những gì cảm thấy phù hợp với bạn. Đừng ngại thử một phương pháp và chuyển lại sau (nhưng hãy cố gắng duy trì tính nhất quán trong mỗi dự án :-)
Đây có phải là cách tiêu chuẩn để giữ các ràng buộc chính xác xung quanh không? Tôi có nên tiêu chuẩn hóa việc sử dụng 'self' ở mọi nơi không, trừ khi tôi rõ ràng cần 'this'.
"self" là tên phổ biến nhất được sử dụng. Như đã nói ở trên, tôi thích cách tiếp cận ngược lại - sử dụng thisngoại trừ khi cần có ràng buộc đóng.
..nếu nó bị coi là hơi ác và tại sao.
Ác ma là một thuật ngữ chủ quan ngớ ngẩn (mặc dù đôi khi rất vui). Tôi chưa bao giờ nói đó là điều xấu xa, chỉ tại sao tôi không làm theo cách tiếp cận. Một số người nói với tôi rằng tôi "xấu xa" vì không sử dụng dấu chấm phẩy. Tôi nói với họ rằng họ thực sự nên đưa ra các lập luận tốt và / hoặc học JavaScript tốt hơn :-)
Tôi biết rằng cũng có hàm javascript tích hợp 'áp dụng' để xác định rõ ràng phạm vi khi gọi một phương thức. Nó có tốt hơn không?
Vấn đề apply/calllà bạn phải sử dụng chúng tại thời điểm gọi hàm. Nó không phải sẽ giúp đỡ nếu có ai khác gọi một trong những phương pháp của bạn như thisthể đã được tắt. Nó hữu ích nhất để thực hiện những việc như gọi lại kiểu jQuery trong đó thisphần tử / mục của lệnh gọi lại, v.v.
Như một bên ...
Tôi muốn tránh "cần tự" đối với các thành viên và do đó nói chung thúc đẩy tất cả các chức năng của thành viên đến các thuộc tính mà receiver ( this) chỉ "chảy qua", thường là "như mong đợi".
Các phương thức "riêng tư" trong mã của tôi bắt đầu bằng dấu "_" và nếu người dùng gọi chúng, thì đó là trên chúng. Điều này cũng hoạt động tốt hơn (thực sự là bắt buộc) khi sử dụng cách tiếp cận nguyên mẫu để tạo đối tượng. Tuy nhiên, Douglas Crockford không đồng ý với cách tiếp cận "riêng tư" này của tôi và có một số trường hợp chuỗi tra cứu có thể cản trở bạn bằng cách đưa vào một bộ thu không mong muốn:
Sử dụng giới hạn "self" trong hàm tạo cũng khóa giới hạn trên của chuỗi tra cứu đối với một phương thức (nó không còn đa hình trở lên!) Có thể đúng hoặc không. Tôi nghĩ rằng nó bình thường không chính xác.
Chúc bạn viết mã vui vẻ.
var that = this, thành thật mà nói, tôi thậm chí còn không bận tâm đến việc áp dụng / gọi, nhưng bây giờ tôi đã đọc về những phương pháp đó, cảm ơn vì câu hỏi này!