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 2011

멋져요, 이걸 찾는데 왜 그렇게 오래 걸 렸는지 모르겠어요! 감사.
droid-zilla

21

내가 아는 한, 일반적으로 개인 변수를 나타내는 데 사용됩니다 (실제로 개인 정보를 제공하지 않고 규칙 만 제공합니다).

http://javascript.crockford.com/code.html 에 대해 권장하지 않지만 여기서 간략하게 설명합니다.


3
나는 링크를 좋아한다 : "능력 부족을 보여주는 관습은 피하라." :-)
Arek 2015

특히 Promises 및 기타 비동기 작업에서 디버깅 할 때 바로 가기로 사용합니다. 예를 들어 내 개체의 일부 속성에 액세스하는 "공식적인"방법 myObj.getSmePromise().then( function(o) { do stuff } );은 Chrome 콘솔에 입력하는 것이 고통스럽기 때문에 myObj._someValue"적절한 코드"가 실제로 액세스하지 않는다는 것을 이해하기로 설정 했습니다. 다음 jQuery / lodash / angular / react를 작성하는 경우 또는 모든 사용자가 이것을 알고 있거나 존중하지 않을 경우이 규칙을 알고있는 동료의 사치도!
FredL

8

사용하는 경우와 같이 _varname이 변수 이름의 한 부분이고, 어떤 자바 스크립트의 의미가 없습니다. 개발자는이를 사용하여 변수의 의미 또는 범위를 나타냅니다. 이 경우 개발자에게이 변수가 로컬 또는 개인 변수 여야한다고 말하는 것처럼 보입니다.

이 특정 예제에서 몇 가지 유의해야 할 사항 _.varname은 underscore.js 라이브러리가있는 변수 또는 함수를 나타냅니다. 또한 _varname밑줄 개체를 포함하는 변수를 나타 내기 위해 사용할 수 있습니다 . 우리 사무실에서도 마찬가지로 $varnameJquery 개체를 포함하는 변수를 나타 내기 위해 사용 합니다.


4

아마도 내부 / 개인 속성을 표시하는 데 사용됩니다. 파이썬에서와 마찬가지로 변수 앞에 밑줄을 붙이는 것은 개발자에게 변수가 내부적이며 변조하지 않는 것이 더 낫다는 것을 개발자에게 알리는 쉬운 방법입니다 (그렇게하면 관련 라이브러리의 사소한 업데이트조차도 문제가 발생할 수 있습니다).


2

일반적으로 _사용자 / 프로그래머에게 문제의 개인 / 보호 변수임을 알리는 데 사용됩니다.


0

언급했듯이, 그것은 많은 개발자들 사이에서 관행이며 그 점에서 좋지 않습니다. 프로그래밍 방법에서 이와 같은 규칙에 의존해야한다면 언어를 사용하기 전에 언어, 방법 및 패턴을 배워야합니다. 누군가 "밑줄"을 사용하지 않고 코드에서 공용 / 개인 메서드를 구분할 수 없다면 문서화 기술이 극도로 부족한 것입니다. 웹상의 많은 공개 프로젝트는 문서화가 매우 부족합니다. 이것이 아마도 대부분의 저학력 개발자들이 "밑줄"규칙을 "수락"한 반면 다른 사람들은 공식적인 디자인 패턴과 방법을 유지하기보다는 흐름을 따르기로 결정한 이유 일 것입니다. ES6 / 7 버전에 "밑줄"이 쓰여지지 않은 이유가 있습니다.

최근 블로그에서 " 밑줄 명명 규칙을 사용하면 변수 함수가 공용인지 개인용인지 여부를 한 눈에 쉽게 알 수 있습니다 ."라는 소프트웨어 엔지니어 관리자를 만났습니다 . 내 대답은 다음과 같습니다. "댓글은 그림과 같습니다.이 경우에는 밑줄 천 개에 해당합니다.

Doxygen이라는 무료 문서화 도구가 있습니다. 특별히 JavaScript를 지원하지는 않지만 주석에 Doxygen 접두사를 사용할 때 JavaScript 응용 프로그램에 대한 전문적인 문서를 생성 할 수 있습니다. 코드 주석에 약간의 노력을 기울일 때 개발자와 사용자 모두를 위해 문서로 JavaScript 애플리케이션을 만드는 것은 정말 간단합니다.

주석을 제거 할 수있는 도구와 "프로덕션 릴리스"에 대한 콘솔 문이 있습니다. 즉, 소스 맵의 사용은 시간과 자원의 낭비이기도합니다. 게시 할 준비가 될 때까지 축소하지 마십시오. 품질 코드, 릴리스 준비 및 배포).


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.