ใน Javascript ขีดล่างหมายความว่าอย่างไร


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();
    },

ฉันกำลังอ่านบทช่วยสอนเกี่ยวกับ backbone.js ที่นี่: http://addyosmani.com/blog/building-spas-jquerys-best-friends/

ขีดล่างคืออะไร? (_index, _photos, _album) ทำไมต้องใช้


2
ขีดล่างไม่มีความหมายเชิงไวยากรณ์อาจเป็นข้อตกลงสำหรับโปรแกรมเมอร์คนนั้นในการระบุประเภทของตัวแปร
Nate Koppenhaver

คำตอบ:


164

หมายถึงเขตข้อมูลส่วนตัวหรือวิธีการส่วนตัว วิธีการที่ใช้สำหรับการใช้งานภายในเท่านั้น

ไม่ควรเรียกออกนอกชั้นเรียน

ช่องส่วนตัวมีข้อมูลสำหรับการใช้งานภายใน

ไม่ควรอ่านหรือเขียนลงใน (โดยตรง) จากภายนอกชั้นเรียน

หมายเหตุ:สิ่งสำคัญมากที่จะต้องทราบว่าการเพิ่มขีดล่างให้กับตัวแปรนั้นไม่ได้ทำให้เป็นส่วนตัว แต่เป็นเพียงหลักการตั้งชื่อเท่านั้น


4
อย่างน้อยก็มีแนวคิดเรื่องเขตข้อมูลส่วนตัว แต่ไม่ได้เป็นส่วนตัวจริงๆคุณสามารถเข้าถึงได้ ผู้เขียนโค้ดข้างต้นตั้งใจให้พวกเขาเป็นส่วนตัว นั่นคือทั้งหมด
Sander

เจ๋งมากไม่รู้ว่าทำไมฉันถึงใช้เวลานานมากในการค้นหาสิ่งนี้! ขอบคุณ.
droid-zilla

21

เท่าที่ฉันทราบโดยทั่วไปมักใช้เพื่อระบุตัวแปรส่วนตัว (แต่ไม่ได้ให้ความเป็นส่วนตัว แต่เป็นเพียงแบบแผน)

มีการพูดคุยสั้น ๆ ที่นี่แม้ว่าจะแนะนำให้ใช้: http://javascript.crockford.com/code.html


3
ฉันชอบลิงก์: "หลีกเลี่ยงการประชุมที่แสดงให้เห็นถึงการขาดความสามารถ" :-)
Arek

ฉันใช้มันเป็นทางลัดเมื่อทำการดีบั๊กโดยเฉพาะอย่างยิ่งกับ Promises และสิ่งที่ไม่ซิงค์อื่น ๆ เช่นวิธีการ "อย่างเป็นทางการ" ในการเข้าถึงแอตทริบิวต์บางอย่างของวัตถุของฉันอาจเป็นได้myObj.getSmePromise().then( function(o) { do stuff } );แต่การพิมพ์ที่คอนโซล Chrome นั้นเป็นเรื่องยากดังนั้นฉันจึงmyObj._someValueเข้าใจว่า "รหัสที่เหมาะสม" จะไม่สามารถเข้าถึงได้จริง - อย่างไรก็ตาม ความหรูหราของเพื่อนร่วมงานของฉันยังรู้ถึงการประชุมนี้หากคุณกำลังเขียน jQuery / lodash / angular / react ต่อไปหรืออะไรก็ตามที่ฉันจะไม่พึ่งพาผู้ใช้ทั้งหมดของคุณที่รู้หรือเคารพสิ่งนี้!
FredL

8

เมื่อใช้เหมือนกับ_varnameว่าเป็นเพียงส่วนหนึ่งของชื่อตัวแปรและไม่มีความหมายจาวาสคริปต์ นักพัฒนาใช้เพื่อแสดงความหมายหรือขอบเขตของตัวแปร ในกรณีนี้ดูเหมือนว่าจะบอกนักพัฒนาว่าตัวแปรนี้ควรเป็นตัวแปรท้องถิ่นหรือส่วนตัว

สิ่งที่ควรทราบบางประการในตัวอย่างนี้โดยเฉพาะการใช้_.varnameจะหมายถึงตัวแปรหรือฟังก์ชันที่มีไลบรารี underscore.js นอกจากนี้ยังสามารถใช้_varnameเพื่อแสดงถึงตัวแปรที่ถือวัตถุขีดล่างในทำนองเดียวกันที่สำนักงานของเราเราใช้$varnameเพื่อแสดงถึงตัวแปรที่มีวัตถุ Jquery


4

อาจใช้เพื่อทำเครื่องหมายคุณสมบัติภายใน / ส่วนตัว เช่นเดียวกับใน python ที่นำหน้าตัวแปรด้วยขีดล่างเป็นวิธีง่ายๆในการบอกนักพัฒนาว่าตัวแปรนั้นอยู่ภายในและพวกเขาจะไม่ยุ่งเกี่ยวกับมัน (และหากทำเช่นนั้นแม้แต่การอัปเดตเล็กน้อยของไลบรารีที่เกี่ยวข้องก็อาจทำให้สิ่งต่าง ๆ เสียหายได้)


2

โดยปกติ_จะใช้เพื่อบอกผู้ใช้ / โปรแกรมเมอร์ว่าเป็นตัวแปรส่วนตัว / ที่มีการป้องกัน


0

ดังที่ได้กล่าวไปแล้วมันเป็นแนวทางปฏิบัติในหมู่นักพัฒนาหลาย ๆ หากคุณต้องใช้รูปแบบเช่นนี้ในวิธีการเขียนโปรแกรมของคุณคุณควรเรียนรู้ภาษาวิธีการและรูปแบบก่อนที่จะพยายามใช้ภาษา หากมีใครไม่สามารถแยกแยะระหว่างวิธีการสาธารณะ / ส่วนตัวในโค้ดของคุณได้โดยไม่ต้องใช้ "ขีดล่าง" แสดงว่าทักษะการจัดทำเอกสารของคุณขาดไปอย่างมาก โครงการสาธารณะหลายโครงการบนเว็บมีเอกสารที่ไม่ดีมากซึ่งอาจเป็นสาเหตุที่อนุสัญญา "ขีดล่าง" "ได้รับการยอมรับ" โดยนักพัฒนาที่มีการศึกษาส่วนใหญ่ในขณะที่โครงการอื่น ๆ ตัดสินใจที่จะดำเนินการตามขั้นตอนนี้แทนที่จะรักษารูปแบบและวิธีการออกแบบที่เป็นทางการ มีสาเหตุที่ไม่เขียน "ขีดล่าง" ลงในเวอร์ชัน ES6 / 7

ในบล็อกเมื่อไม่นานมานี้ฉันได้พบกับ Software Engineer Manager ที่ระบุว่า: " หลักการตั้งชื่อขีดล่างทำให้ง่ายต่อการบอกได้อย่างรวดเร็วว่าฟังก์ชันตัวแปรมีจุดมุ่งหมายเพื่อสาธารณะหรือส่วนตัว " คำตอบของฉันคือ: "ความคิดเห็นก็เหมือนกับรูปภาพในกรณีนี้พวกเขามีมูลค่าหนึ่งพันขีดล่าง

มีเครื่องมือเอกสารฟรีที่เรียกว่า Doxygen แม้ว่าจะไม่สนับสนุน JavaScript โดยเฉพาะ แต่ก็สามารถสร้างเอกสารระดับมืออาชีพสำหรับแอปพลิเคชัน JavaScript ของคุณเมื่อคุณใช้คำนำหน้า Doxygen ในความคิดเห็นของคุณ การสร้างแอปพลิเคชัน JavaScript พร้อมเอกสารเป็นเรื่องง่ายมากสำหรับทั้งนักพัฒนาและผู้ใช้เมื่อคุณใช้ความพยายามเพียงเล็กน้อยในการแสดงความคิดเห็นเกี่ยวกับโค้ดของคุณ

โปรดจำไว้ว่ามีเครื่องมือที่สามารถลบความคิดเห็นและคอนโซลคำสั่งสำหรับ "รุ่นที่ใช้งานจริง" ดังที่กล่าวมาการใช้แผนที่ต้นทางเป็นการเสียเวลาและทรัพยากรเช่นกัน อย่าย่อขนาดจนกว่าคุณจะพร้อมที่จะเผยแพร่ .. เช่น Dev Build (ไม่มีการย่อขนาดเก็บความคิดเห็นและคำสั่งคอนโซล) Release Build (ลบความคิดเห็นและคำสั่งคอนโซลและลดขนาด Dev build ไม่จำเป็นต้องคอมไพล์ Dev Build ใหม่เมื่อรีลีส รหัสคุณภาพเพียงแค่เตรียมสำหรับการเปิดตัวและปรับใช้)


2
คุณจะไม่เห็นความคิดเห็นเว้นแต่คุณจะดูซอร์สโค้ดของฟังก์ชัน หากคุณกำลังใช้ไลบรารี / รหัสของผู้อื่นระบบจะเพิ่มมูลค่าให้สามารถดูเจตนาของวิธีการได้โดยไม่ต้องอ่านแหล่งที่มาหรือเอกสารประกอบ Imo คำนำหน้าขีดล่างบอกว่าเป็น API ที่ไม่เป็นสาธารณะซึ่งไม่ควรพึ่งพา
Sam P

0

นี่เป็นภาคผนวกเล็กน้อย ตามที่ตอบไปแล้วสิ่งเหล่านี้เป็นตัวแปรส่วนตัวหลอก แต่เป็นไปได้ที่จะเขียนฟังก์ชันสาธารณะหลอกที่เข้าถึงตัวแปรส่วนตัวเหล่านี้

ฉันสับสนกับรหัสเพื่อนร่วมงานที่มีสิ่งนี้อย่างมีประสิทธิภาพ (แต่ฝังลึกมากในห้องสมุดแยกต่างหาก):

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

ตอนนี้คุณมีทั้งสองอย่าง y.idและy._idทำงานนั้นและส่งคืนค่าเดียวกัน แต่ถ้าคุณทำconsole.log(y)มันจะแสดงเฉพาะ_idคีย์

ใส่คำอธิบายภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.