2016-08-26 19 views
2

난 그냥 다음과 같은 자바 스크립트 코드 ..."안전하지 않은 게시"가 Javascript에 있습니까?

class Team { 
    constructor(id, eventHandler) { 
     this.id = id; 
     this._eventHandler = eventHandler; 
     this._eventHandler.trigger("NewTeam", this); // my concerning line 
    } 
} 

내가 자바 배경이를 썼다. 자바에서는 객체가 자신의 생성자 ("안전하지 않은 게시")에서 참조를 공유하는 것이 위험하다고 간주됩니다. 다른 스레드가 유효한 상태가되기 전에 객체에서 작동 할 수 있기 때문입니다.

Javascript에서도 위험할까요? 나쁜 연습으로 간주됩니까?

한 가지 문제 만 생각하면됩니다. Team을 확장하려면 eventHandler.trigger("NewTeam",__)에 추가 속성을 표시하는 것이 까다로울 수 있습니다.

+3

JavaScript가 단일 스레드입니다. 또한 자바에 대해 아는 바가 자바 스크립트와 관련이 없다고 가정하는 것이 가장 좋습니다. – Pointy

+1

물론 자바 스크립트에서도 참조를 공유하기 전에 초기화를 완료해야합니다. 그러나 생성자에 특별한 것은 없습니다 – Bergi

+1

@Bergi - 하위 클래스가 있습니다. 생성자 고려 사항 - 로컬 초기화로 완료되었지만 초기화로 아직 완료되지 않았지만 생성자에게는 다소 고유 한 하위 클래스가있을 수 있습니다. – jfriend00

답변

2

자바 스크립트는 단일 스레드이므로 여기서는 자바에 대한 언급이 자바 스크립트에는 적용되지 않습니다. 다른 코드는 생성자와 동시에 실행되지 않습니다. 이것은 Javascript의 단일 스레드 및 이벤트 중심 특성을 크게 단순화 한 것입니다.

이벤트를 동 기적으로 트리거하거나 함수 호출을 작성하고 미완료 객체를 해당 이벤트 핸들러 또는 함수 호출에 전달하는 경우 미완료 객체 참조를 다른 코드로 전달하기 때문에 문제가 발생하는 것은 물론입니다 생성자를 완료하기 전에 실행됩니다.

전달할 객체가 유효한 상태에있는 한 이것은 문제가되지 않지만 미완성 객체를 전달한 경우 실제로 문제를 묻는 중입니다.하지만 이것은 실제로 일반적입니다. 센스 프로그래밍, 스레딩 또는 동시성과 관련이 없습니다. 특정 경우


은 :

class Team { 
    constructor(id, eventHandler) { 
     this.id = id; 
     this._eventHandler = eventHandler; 
     this._eventHandler.trigger("NewTeam", this); // my concerning line 
    } 
} 

당신은 취약점을 만들었습니다. Team이 서브 클래 싱 된 경우 this._eventHandler.trigger("NewTeam", this);을 호출하고 서브 클래스가 반드시 생성자를 완료하기 전에 this을 전달해야합니다. 특정 구현에 따라 이것이 문제가 될 수 있으므로 항상 실천이 안전하지는 않습니다. .trigger()이 다음 틱에서 호출 될 수있는 경우 (setImmediate() 또는 nextTick()을 사용하면 개체와 하위 클래스가 호출되기 전에 항상 완료되기 때문에 항상 안전합니다.)