Trong Javascript, dấu gạch dưới này có nghĩa là gì?


85
var Gallery = Backbone.Controller.extend({
    _index: null,
    _photos: null,
    _album :null,
    _subalbums:null,
    _subphotos:null,
    _data:null,
    _photosview:null,
    _currentsub:null,
    routes: {
        "": "index",
        "subalbum/:id": "subindex",
        "subalbum/:id/" : "directphoto",
        "subalbum/:id/:num" : "hashphoto"
    },
    initialize: function(options) {
        var ws = this;
        if (this._index === null){
            $.ajax({
                url: 'data/album1.json',
                dataType: 'json',
                data: {},
                success: function(data) {
                    ws._data = data;
                    ws._photos =
                    new PhotoCollection(data);
                    ws._index =
                    new IndexView({model: ws._photos});
                    Backbone.history.loadUrl();
                }
            });
            return this;
        }
        return this;
    },
    //Handle rendering the initial view for the
    //application
    index: function() {
        this._index.render();
    },

Tôi đang đọc hướng dẫn về backbone.js tại đây: http://addyosmani.com/blog/building-spas-jquerys-best-friends/

Dấu gạch dưới là gì? (_index, _photos, _album) Tại sao lại sử dụng chúng?


2
các dấu gạch dưới không có ý nghĩa cú pháp, nó có thể là một quy ước cho rằng lập trình đặc biệt để biểu thị các loại các biến
Nate Koppenhaver

Câu trả lời:


164

Nó có nghĩa là các trường riêng hoặc các phương thức riêng. Phương pháp chỉ sử dụng nội bộ.

Chúng không nên được gọi ra bên ngoài lớp học.

Các trường riêng tư chứa dữ liệu để sử dụng nội bộ.

Chúng không nên được đọc hoặc ghi vào (trực tiếp) từ bên ngoài lớp học.

Lưu ý: Điều rất quan trọng cần lưu ý là chỉ thêm dấu gạch dưới vào một biến sẽ không làm cho biến đó ở chế độ riêng tư, nó chỉ là một quy ước đặt tên.


4
ít nhất, ý tưởng về các trường riêng tư là có, nhưng chúng không thực sự riêng tư, bạn vẫn có thể truy cập chúng. tác giả của đoạn mã trên chỉ muốn chúng ở chế độ riêng tư. đó là tất cả.
Sander

Tuyệt vời, không biết tại sao tôi lại mất nhiều thời gian để tra cứu cái này! Cảm ơn.
droid-zilla

21

Theo như tôi biết, nó thường được sử dụng để chỉ một biến riêng tư (nhưng không thực sự cung cấp bất kỳ quyền riêng tư nào, chỉ là một quy ước).

Nó được thảo luận ngắn gọn ở đây, mặc dù chúng được khuyên không nên: http://javascript.crockford.com/code.html


3
Tôi thích liên kết: "Tránh các quy ước thể hiện sự thiếu năng lực." :-)
Arek

Tôi sử dụng chúng làm phím tắt khi gỡ lỗi, đặc biệt với Promises và các nội dung không đồng bộ khác. ví dụ: cách "chính thức" để truy cập vào một số thuộc tính của đối tượng của tôi có thể là myObj.getSmePromise().then( function(o) { do stuff } );nhưng thật khó khi nhập vào bảng điều khiển Chrome, vì vậy tôi myObj._someValuehiểu rằng "mã thích hợp" sẽ không thực sự truy cập vào nó - tuy nhiên, điều này là với sự sang trọng của đồng nghiệp của tôi cũng biết quy ước này, nếu bạn đang viết jQuery / lodash / angle / react tiếp theo hoặc bất cứ điều gì tôi sẽ không dựa vào việc tất cả người dùng của bạn biết hoặc tôn trọng điều này!
FredL

8

Khi được sử dụng như thể _varnamenó chỉ là một phần của tên biến và không có ý nghĩa javascript. Các nhà phát triển sử dụng nó để biểu thị ý nghĩa hoặc phạm vi của biến. Trong trường hợp này, có vẻ như nó đang nói với nhà phát triển rằng biến này phải là biến cục bộ hoặc biến riêng.

Một số điều cần lưu ý, trong ví dụ cụ thể này, việc sử dụng _.varnamesẽ biểu thị một biến hoặc hàm với thư viện underscore.js. Ngoài ra, người ta có thể sử dụng _varnameđể biểu thị một biến chứa một đối tượng gạch dưới, tương tự tại văn phòng của chúng tôi, chúng tôi sử dụng $varnameđể biểu thị một biến chứa một đối tượng Jquery.


4

Nó có thể được sử dụng để đánh dấu thuộc tính nội bộ / riêng tư. Cũng giống như trong python, việc đặt tiền tố cho một biến bằng dấu gạch dưới là một cách dễ dàng để cho các nhà phát triển biết rằng một biến là nội bộ và tốt hơn là họ không nên giả mạo nó (và nếu họ làm như vậy, ngay cả một bản cập nhật nhỏ của thư viện liên quan cũng có thể làm hỏng mọi thứ).


2

Thường _được sử dụng để nói với người dùng / lập trình viên rằng đó là một biến riêng tư / được bảo vệ đang được đề cập.


0

Như đã đề cập, đó là một thói quen của nhiều nhà phát triển, một điều tồi tệ ở đó. Nếu bạn phải sử dụng các quy ước như thế này trong các phương pháp lập trình của mình thì bạn nên học ngôn ngữ, phương pháp và mẫu trước khi cố gắng sử dụng ngôn ngữ đó. Nếu ai đó không thể phân biệt giữa các phương thức công khai / riêng tư trong mã của bạn mà không sử dụng "dấu gạch dưới", thì kỹ năng lập tài liệu của bạn là cực kỳ thiếu. Nhiều dự án công khai trên web được ghi chép rất kém, đó có lẽ là lý do tại sao quy ước "gạch dưới" được hầu hết các nhà phát triển có học thức "chấp nhận" trong khi những người khác quyết định đi theo dòng chảy thay vì giữ các mẫu và phương pháp thiết kế chính thức. Có một lý do tại sao "gạch dưới" không được viết trong các phiên bản ES6 / 7.

Trong một blog gần đây, tôi tình cờ gặp một Giám đốc Kỹ sư Phần mềm, người đã nói: " Quy ước đặt tên gạch dưới giúp bạn thực sự dễ dàng biết ngay một hàm biến được dự định là công khai hay riêng tư ". Phản hồi của tôi là: “Các bình luận giống như hình ảnh, trong trường hợp này, chúng có giá trị một nghìn dấu gạch dưới.

Có một công cụ tài liệu miễn phí được gọi là Doxygen. Mặc dù nó không hỗ trợ cụ thể JavaScript, nó có thể tạo tài liệu chuyên nghiệp cho các ứng dụng JavaScript của bạn khi bạn sử dụng tiền tố Doxygen trong nhận xét của mình. Thực sự đơn giản để tạo các ứng dụng JavaScript với tài liệu, cho cả nhà phát triển và người dùng khi bạn bỏ một chút công sức vào các nhận xét mã của mình.

Hãy nhớ rằng có những công cụ có thể xóa nhận xét và câu lệnh trên bảng điều khiển cho "Bản phát hành sản xuất". Điều đó nói lên rằng, việc sử dụng các bản đồ nguồn cũng gây lãng phí thời gian và tài nguyên. Đừng thu nhỏ cho đến khi bạn sẵn sàng xuất bản .. tức là Dev Build (không thu nhỏ, giữ lại nhận xét và câu lệnh bảng điều khiển), Release Build (xóa nhận xét, câu lệnh bảng điều khiển và thu nhỏ bản dựng Dev. Không cần biên dịch lại Bản dựng Dev khi phát hành mã chất lượng, chỉ cần chuẩn bị để phát hành và triển khai nó).


2
Bạn sẽ không thấy nhận xét trừ khi bạn đang xem mã nguồn của một hàm. Nếu bạn đang sử dụng thư viện / mã của người khác, nó sẽ thêm một số giá trị để có thể xem mục đích của phương pháp mà không cần đọc nguồn hoặc tài liệu. Imo tiền tố gạch dưới nói rằng đó là một API không công khai không nên dựa vào.
Sam P,

0

Đây là một phụ lục nhẹ. Như đã trả lời, đây là các biến riêng tư giả. Nhưng sau đó có thể viết các hàm công khai giả truy cập các biến riêng tư này.

Tôi đã bối rối bởi một mã đồng nghiệp có hiệu quả này (nhưng bị chôn vùi rất sâu trong một thư viện riêng biệt):

class x { 
  constructor(id) {this._id = id} 
  get id() {return this._id}
}
let y = new x(3)

Bây giờ bạn có cả hai y.idy._idcông việc đó và trả về cùng một giá trị. Nhưng nếu bạn làm điều console.log(y)đó chỉ hiển thị _idchìa khóa.

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.