2014-09-25 4 views
0

왜 내 객체 대신 Window가 반환되는지 이해하려고합니다. 이전 예제를 보면 이것이 효과가있다. 나는 명백한 것을 놓치고 있어야합니다. Javascript 'this'이 내 객체 대신 윈도우를 반환합니다.

(function($) { 
 
    if (typeof a === "undefined" || a === null) a = {}; 
 
    if (typeof a.b === "undefined" || a.b === null) a.b = {}; 
 
    if (typeof a.b.c === "undefined" || a.b.c === null) a.b.c = {}; 
 
    if (typeof a.b.c.d === "undefined" || a.b.c.d === null) a.b.c.d = {}; 
 
    if (typeof a.b.c.d.e === "undefined" || a.b.c.d.e === null) a.b.c.d.e = {}; 
 

 
    a.b.c.d.e.MyObject = { 
 
    method1: function() { 
 
     console.log(this); //Returning Window 
 
    }, 
 

 
    method2: function() { 
 

 
    } 
 
    } 
 
}(jQuery));
다른 JS 파일의 평가()를 통해 호출 될.

+8

어떻게하면 'method1'을 호출하는지 알 수 없습니다. 모든 차이를 만들 수 있습니다 ... –

+0

페이지가로드 될 때 a.b.c.d.e.MyObject.method1에 대한 호출이 있습니다. – mgoodric

+1

'window.onload = a.b.c.d.e.MyObject.method1;'과 같은 작업을했기 때문에 문제가 발생했습니다. 'this'의 값은 함수가 정의 된 방식이 아닌 **라는 ** 함수에 의해 결정됩니다. – Pointy

답변

0

@Lee Tayor와 @Point 덕분에 문제가 해결되었습니다.

function initMyObject() { 
 
    a.b.c.d.e.MyObject.method1(); 
 
}

0

나는 이미 답을 가지고 있다고 생각하지만 난 당신이 정말을해야한다고 생각 : 내가 평가 후면() 호출을 통해 호출되고 있었는지 통제 할 수 없었기 때문에, 나는 다음과 같은 호출하기 위해 평가를 수정 JS 객체가 생성되는 방식을 살펴보십시오. eval을 사용하는 경우 실제로 무엇을하고 있는지 알지 못하는 한 강력히 추천합니다.

var MyClass = function() { 
    this.attr = 'Hello World!'; 
} 

var myObject = new MyClass(); //Remember the new!!!! 

및 방법은 다음과 같이 선언 (새로운 객체를 생성하기 전에이 작업을 수행) :

MyClass.prototype.myMethod = function() { 
    return this.attr; 
} 

이 방법은 "이"객체를 참조하지 않습니다
는 객체의 사용을 만들려면 마녀의 범위는 기능이 실행되었습니다. JS 객체를 잘 살펴보고, JavaScript: The Good Parts을 참조하여 js를 사용하기위한 좋은 습관을 얻으십시오.

+0

eval의 의미에 대해 알고 있습니다. 불행하게도 현재 작성중인 코드는 기존 프레임 워크에 통합되어 있습니다. 핵심 제품을 수정할 수 없습니다. – mgoodric

+0

힘든 행운. 객체 정의가 도움이되기를 바랍니다. – donnanicolas

관련 문제