2013-03-04 1 views
-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 개체를 초기화해야합니까? 내가 뭘 놓치고 있니?

+0

이미 말했듯이 '요소'는 'null'입니다. 그리고 당신의'Physics' 생성자에서 여러분은 그것에 대해 메서드를 호출하려고합니다. 이것은 분명 불가능합니다. – Bergi

+0

@Bergi 그게 뭔지는 모르겠다. – Madbreaks

+0

@Bergi 나는 이미 그것을 알고있다. 나는'Physics' 클래스의 실행 순서와 범위에 더 관심이있었습니다. 'game.js'와'physics.js'는 모두 자체 실행 함수였습니다. 아마도 '

0

오류는 준비가되지 않은 피직스 개체와 아무 관련이 없습니다. 코드가 호출 될 때 페이지에없는 요소를 참조하려고하는 코드 내부의 코드와 관련이 있습니다.

이 요소가 페이지에로드하기 전에

document.getElementById("b2dCanvas") 

를 호출했다 간단합니다. getElementById가 아무것도 찾지 못하면 null을 반환합니다.

그래서 코드는 당신이 그것을

var physics = new Physics(null, 30); 

및 요소를 검사한다면 어떻게 생겼는지 널 따라서

function Physics(element, scale){ 
    var ctx = element.getContext("2d"); //<-- where the error occurs since element is null 

오류입니다 : Uncaught TypeError: Cannot call method 'getContext' of null.

로드 이벤트를 수신하면 요소가로드되어있어 문제없이로드된다는 것을 의미합니다. 스크립트를 페이지 하단에 추가하는 방법도 있습니다.

+0

op와 같은 소리는 이미 알고 있습니다. * "물리 생성자가 호출되었습니다 (자연스럽게이 요소는 null입니다)"* – Madbreaks

+0

@Madbreaks 문제는 OP가 페이지 수명주기를 이해하지 못합니다. – epascarello

+0

나는 그것이 사실이라고 생각하지 않는다. 나는 op가 (리터럴) 질문에 기초하여 그/그녀가 사용하고있는 함수 구문을 이해하지 못한다고 생각한다. 오 잘, op는 우리 대답 중 * 어느 것도 받아들이지 않았다. :) – Madbreaks

1

This meant, the physics constructor was being called(and naturally element at this point was null) without me invoking it. How was that possible?

당신 있습니다이 구문을 사용하여, 그것을 호출 Becase :

(function(){...}()); 
       ^^ 
       call 
스크립트가 일반 페이지 스크립트 구문 분석의 일부로서 구문 분석 할 때 함수를 호출하고 기다리지 않습니다

문서/DOM을 조작 할 준비가되었습니다. 어떤 종류의 문서 '로드'리스너를 사용하거나 특정 구문을 제거하고 DOM이 준비되었다고 확신 할 때 함수를 수동으로 호출 할 수 있습니다.

0

내 생각 엔 DOM이 준비되기 전에 함수를 호출하고있는 것 같습니다. 스크립트 하단에 코드를 포함 시키거나 심지어 창로드 리스너를 모두 초기화하십시오.