2014-11-03 4 views
0

다른 객체의 private 함수 인 객체의 함수에 대해 timeout을 설정하려고합니다. 실제로 구조는 다음과 같은 것입니다 :private 객체의 함수에 대한 setTimeout

function MainObject() { 
    var id; 
    ... 
    var InnerObject = function() { 
     this.getSomething = function() { ... } 
    } 

    this.testFunc = function() { 
     id = setTimeout(InnerObject.getSomething(), 1000); 
    } 
} 

... 그리고 시간 제한을 설정하려고 할 때 그것이 '정의되지 않은'말하는대로 작동하지 않습니다, 그것은 개인 함수의 나는 직접이 기능을 실행할 수 없습니다 . 내가 뭘 잘못하고 있니? 특정 무언가를 찾으려고했지만 성공하지 못했습니다. 범위 오류 문제의 어딘가에 오류가있는 것 같지만 여전히 이해하지 못합니다.

+0

첫 번째 문제 : InnerObject.getSomething()을 호출하지 않고 할당하고 있습니다. – epascarello

+2

'InnerObject'는 생성자 함수처럼 보입니다.하지만 결코 생성자로 객체를 생성하지 않았습니다 (예 : 호출하지 않은 경우). 'InnerObject.getSomething' 속성은 없습니다. 당신이'var obj = new InnerObject();'를했다면, 당신은'obj.getSomething()'을 할 수 있습니다. 또한'setTimeout()'에 전달할 필요가있는 것은 함수이므로'.getSomething()'이 함수를 반환하지 않으면 실행하고 싶지 않습니다. – jfriend00

+1

실망스러운 질문입니다. 여기서 많은 일들이 잘못되어 있으며, 당신이하려는 일을하는 데 지나치게 복잡한 접근법을 사용하고있는 것처럼 보입니다.하지만 실제로 해결하려고하는 문제에 대한 정보가 없거나 이 복잡한 경로를 거치지 않고 "올바른 방법으로"제안 할 정확한 것을 정확히 알지 못합니다. – jfriend00

답변

0

왜 복잡한 접근 방식을 선택했는지에 관해서는 거의 알려주지 않았기 때문에 작동시킬 수있는 것으로 단순화 할 것입니다. 당신의 접근 방식 문제

function MainObject() { 
    var id; 
    ... 
    function getSomething() { 
     // code here 
    } 

    this.testFunc = function() { 
     id = setTimeout(getSomething, 1000); 
    } 
} 

것들 :

  1. InnerObject는 생성자 함수를 보이지만, 실제로 호출하지 않습니다.
  2. InnerObject은 생성자 함수이므로 InnerObject.getSomething 속성이 없습니다. var obj = new InnerObject()을 수행 한 경우 전화 할 수있는 obj.getSomething 속성이 있습니다.
  3. setTimeout()에 함수 참조를 전달합니다. getSomething()이 함수를 반환하지 않는 한 호출하지 않으려는 경우 괄호없이 함수 참조 만 전달하면됩니다.

당신이 정말로 InnerObject을 유지하고 싶다면, 당신은 실제로 같은 그 생성자와 객체를 인스턴스화해야 할 것 :

function MainObject() { 
    var id; 
    ... 
    var InnerObject = function() { 
     this.getSomething = function() { ... } 
    } 
    // call your constructor and create an object 
    var obj = new InnerObject(); 

    this.testFunc = function() { 
     id = setTimeout(obj.getSomething.bind(obj), 1000); 
    } 
} 

참고 : .bind(obj)이되도록 사용되는 getSomething()이 타이머 코드에 의해 호출되면 this 포인터가 올바르게 설정됩니다.

+0

오, 고마워요, 그것은 bind (obj) 함수와 함께 작동합니다! 그것은 setTimeout에 전달 된 함수와 같이 한 번만 작동합니다 (실제로 함수 였음에도 불구하고). 분명히, 것은 정말로 단순화 될 필요가 있습니다. 고마워요 :) – Kaito

-2

은 익명의 함수 또는 표현식으로 보낼 수 있습니다. 당신은 값을 반환하는 함수를 보내고 그 값은 setTimeout()에 대한 인자로 보내졌습니다.

id = setTimeout("InnerObject.getSomething()", 1000); 

익명 함수로 : 표현으로

id = setTimeout(function(){InnerObject.getSomething()}, 1000); 

또한, 코멘트에 jfriend00가 지적 당신이 InnerObject 유형을 만든 경우,이는 다음과 같이 작동합니다 :

id = setTimeout(function(){ 
    var innerObj = new InnerObject(); 
    innerObj.getSomething(); 
}, 1000); 

희망, 도움이 되셨습니다. 행운을 빈다.

+0

'InnerObject.getSomething' 속성은 없습니다. 단순히 존재하지 않으므로 결코 작동하지 않습니다. – jfriend00

+0

@ jfriend00 제 답변을 고칠 때 잠시만 기다려주십시오. 그것은 코드와 함께 다른 오류를 노출합니다. – phantom

+0

AFAIK, 익명 함수는 전역 컨텍스트를 사용하는 척하므로 private 객체에 액세스하려고 할 때 여기에서 사용할 수 없습니다. – Kaito

0

InnerObject를 생성자로 설정 했으므로 초기화해야합니다. 그리고 setTimeout 함수를 기대하고 있지만 실제로 함수를 호출하고 있습니다.

function MainObject() { 
    var id; 

    var InnerObject = function() { 
     this.getSomething = function() { 
      console.log('getSomething called'); 
     }; 
    }; 

    this.testFunc = function() { 
     id = setTimeout((new InnerObject()).getSomething, 1000); 
    }; 
} 

var o = new MainObject(); 
o.testFunc(); 

데모 : http://jsbin.com/lozolujatu/1/edit

0

당신은 생성자가 아닌 객체에 getSomething()를 호출하고 있습니다. 실제로 InnerObject를 인스턴스화하는 것처럼 보이지 않습니다.

function MainObject() { 
    var id; 
    ... 
    var InnerObject = (function() { 
     this.getSomething = function() { ... } 
    }()); 

    this.testFunc = function() { 
     id = setTimeout(InnerObject.getSomething(), 1000); 
    } 
} 

이제 InnerObject 포인트 : InnerObject은, 다음, 즉시-호출 함수 표현식 (인생)에 InnerObject을과 같이 필요가 어떤 (대신 실제 함수의)이 함수가 반환을 가리 키도록 예정되어있는 경우 작성한 함수를 호출 한 결과로 생성자에서 볼 수있는 this.getSomething 멤버를 갖게됩니다.하지만 InnerObject는 여전히 생성자 내부의 변수이기 때문에 다른 곳에서는 볼 수 없습니다.

여기서 catch는 IIFE를 사용했기 때문에 InnerObject는 한 번만 인스턴스화됩니다. 동일한 생성자에서 여러 인스턴스를 인스턴스화해야하는 경우 핸들을 유지해야합니다. 그러나 사적인 기간 동안이 작업을 수행 할 수 있습니다. InnerObject 생성자로

function MainObject() { 
    var id; 
    ... 
    function InnerObject() { 
     this.getSomething = function() { ... } 
    }; 

    var inner1 = new InnerObject(), 
     inner2 = new InnerObject(), 
     inner3 = new InnerObject(); 

    this.testFunc = function() { 
     id = setTimeout(inner1.getSomething(), 1000); 
    } 
} 

inner1, inner2inner3는 여전히 개인 있습니다 : 하나의 가능성은 같을 수 있습니다. 방금 this.testFunc에 대한 작업 중 하나를 선택했습니다.

+0

inner1과 같이 변수를 인스턴스화했지만 .. 이제 setTimeout 함수는 propetly (실제로는 getSomething() 함수가 한 번만 호출합니다)는 작동하지 않습니다. 문제는 내가 예상했던 것보다 더 힘들어 보인다./ – Kaito

+0

setTimeout()은 한 번만 함수를 호출합니다.반복적으로 호출해야하는 경우 setInterval()을 사용하거나 getSomething() 끝 부분에서 setTimeout()을 다시 호출해야합니다. 두 방법 모두 장단점이 있습니다. –