-1
js에서 oop를 처음 사용했습니다. Box2dWeb을 사용하여 HTML5 게임을 만들고 있는데, 게임을 완전히 기반으로해야한다고 결정했습니다.js 스코프 및 외부 클래스에 대한 의문점
: 그래서(function(window)
{
function Physics(element, scale){
//init world logic
}
Physics.prototype.debug = function(){
//debug draw logic
};
Physics.prototype.step = function(dt){
//step logic
};
//making this class(or object) visible on the global scope
//so i can create vars of this type anywhere in the application
window.Physics = Physics;
}(window));
physics.js
지금 나는 등 여기, 내 모든 게임 물리, 그래픽, 자산을 초기화하기 메인 game.js
파일이라는 별도의 파일에 같은 물리학 클래스를 만들었는 내용이다
(function(){
function init(){
var physics = new Physics(document.getElementById("b2dCanvas"), 30);
console.log(physics);
physics.debug();
}
window.addEventListener("load", init);
}());
이 파일은 문제없이 내 Physics 개체를 초기화합니다. 궁극적으로 이것이 내가 원하는 것입니다. 큰! 그러나 이전에이 파일은 init()
함수 없이는 이와 같았습니다.
(function(){
var physics = new Physics(document.getElementById("b2dCanvas"), 30);
console.log(physics);
physics.debug();
}());
이것은 분명히 오류 Uncaught TypeError: Cannot call method 'getContext' of null
을 던졌습니다. 이것은 물리 생성자가 호출되고 있음을 의미합니다 (그리고이 시점에서 자연스럽게 element
은 null이었습니다). 어떻게 가능 했습니까? game.js
의 자체 실행 기능은 Physics
개체를 초기화해야합니까? 내가 뭘 놓치고 있니?
이미 말했듯이 '요소'는 'null'입니다. 그리고 당신의'Physics' 생성자에서 여러분은 그것에 대해 메서드를 호출하려고합니다. 이것은 분명 불가능합니다. – Bergi
@Bergi 그게 뭔지는 모르겠다. – Madbreaks
@Bergi 나는 이미 그것을 알고있다. 나는'Physics' 클래스의 실행 순서와 범위에 더 관심이있었습니다. 'game.js'와'physics.js'는 모두 자체 실행 함수였습니다. 아마도 '
오류는 준비가되지 않은 피직스 개체와 아무 관련이 없습니다. 코드가 호출 될 때 페이지에없는 요소를 참조하려고하는 코드 내부의 코드와 관련이 있습니다.
이 요소가 페이지에로드하기 전에
를 호출했다 간단합니다. getElementById가 아무것도 찾지 못하면 null을 반환합니다.그래서 코드는 당신이 그것을
및 요소를 검사한다면 어떻게 생겼는지 널 따라서
오류입니다 :
Uncaught TypeError: Cannot call method 'getContext' of null
.로드 이벤트를 수신하면 요소가로드되어있어 문제없이로드된다는 것을 의미합니다. 스크립트를 페이지 하단에 추가하는 방법도 있습니다.
출처
2013-03-04 20:04:06 epascarello
op와 같은 소리는 이미 알고 있습니다. * "물리 생성자가 호출되었습니다 (자연스럽게이 요소는 null입니다)"* – Madbreaks
@Madbreaks 문제는 OP가 페이지 수명주기를 이해하지 못합니다. – epascarello
나는 그것이 사실이라고 생각하지 않는다. 나는 op가 (리터럴) 질문에 기초하여 그/그녀가 사용하고있는 함수 구문을 이해하지 못한다고 생각한다. 오 잘, op는 우리 대답 중 * 어느 것도 받아들이지 않았다. :) – Madbreaks
당신 있습니다이 구문을 사용하여, 그것을 호출 Becase :
스크립트가 일반 페이지 스크립트 구문 분석의 일부로서 구문 분석 할 때 함수를 호출하고 기다리지 않습니다문서/DOM을 조작 할 준비가되었습니다. 어떤 종류의 문서 '로드'리스너를 사용하거나 특정 구문을 제거하고 DOM이 준비되었다고 확신 할 때 함수를 수동으로 호출 할 수 있습니다.
출처
2013-03-04 20:04:30 Madbreaks
내 생각 엔 DOM이 준비되기 전에 함수를 호출하고있는 것 같습니다. 스크립트 하단에 코드를 포함 시키거나 심지어 창로드 리스너를 모두 초기화하십시오.
출처
2013-03-04 20:04:48 Tal