2011-12-19 3 views
2

내 응용 프로그램에는 응용 프로그램의 여러 위치에 여러 속성이 설정된 개체가 있습니다.개체의 속성에 도달하기

제 프로토 타입 함수 중 하나에는 타이머를 업데이트하는 간격으로 실행되는 함수가 있는데 그 함수 (this.)에서 theTime을 설정해야합니다. 문제는 이것이 발생하지 않는다는 것입니다. 이유는 그 이유는 this.theTime이 개체 대신 함수 자체를 가리키고 있기 때문입니다.

다음은 내 코드의 두 가지 버전이며 두 가지 버전이 모두 작동하지 않습니다. 나 한테 요령있어?

// 1. 
function changeTime() { 
    this.theTime = setTime(time); 
    time.setSeconds(time.getSeconds()+1); 
    p1.html(this.theTime); 
} 
interval = setInterval(changeTime(), 1000); 

// 2. 
function changeTime(theTime) { 
    theTime = setTime(time); 
    time.setSeconds(time.getSeconds()+1); 
    p1.html(theTime); 
} 
interval = setInterval(function() { changeTime(this.theTime); }, 1000); 

...

너무 좀 더 명확하게는, 함수는 위의 타이머를 업데이트합니다. (예 : 00:00:01 -> 00:00:02) 초마다, 나는 this.theTime이 시간으로 업데이트하고 싶습니다.

타이머가 멈 추면 (다른 프로토 타입 함수에서 발생 함) 타이머가 멈춘 시간을 볼 수 있기를 원합니다. 그러나 지금은 this.theTime이 기본값입니다. 즉 위의 함수는 기본값이 아닙니다. objects 속성을 업데이트하십시오. 대신 위 함수에서 this.theTime은 지역 변수 여야합니다.

참고 : setTime()은 위의 함수와 동일한 프로토 타입 함수에있는 다른 함수입니다.

+1

무엇을 'this'로 설정해야합니까? 귀하의 코드는 작동하지 않지만이를 고치는 방법을 정확하게 말하는 것은 불가능하다는 것을 알지 못합니다. 'this' 값은 각 함수 호출시 설정됩니다; 그것은 어떤 기능에서도 영구 고정 된 것이 아닙니다. – Pointy

+0

'setTime()'이 당신이 작성한 함수이거나 JS 함수'Date.setTime()'을 사용하려고합니까? –

+0

@JasonCraig 나는 몇 가지 더 정리할 질문을 좀 더 편집했습니다. –

답변

1

우물로 안내합니다은 실제로 함수가 참조하는 객체를 참조합니다. 여기 :

function myF() { 
    this.var = 'hey'; 
} 

당신은 (생성자 함수로 myF)이 사용 var에 도달 할 수 있습니다 : 여기

var obj = new myF(); 
alert(obj.var); 

또는를 :

여기 var
function myF2() { 
    if (typeof this.var === 'undefined') { 
     this.var = 0; 
    } else { 
     this.var += 1; 
    } 
    alert(this.var); 
} 

다시 myF2의 속성입니다 (이 JavaScript 함수는 객체이기 때문에 함수는 아닙니다. myF2를 호출 할 때마다 this.var가 증가하고 경고됩니다 (첫 번째 호출이 초기화 될 예정 임).

두 번째 함수 (두 번째 setInterval에서 사용하는 익명 함수)에서도 동일한 작업을 수행합니다.

var theTime = 0, interval; 
function changeTime() { 
    theTime += 1; 
    document.body.innerHTML = theTime; 
    setInterval 
} 

interval = setInterval(changeTime, 1000); 

http://jsfiddle.net/u3EuC/

0

당신은 당신의 기능에 중단 점을 설정하는

debugger; 

을을 writting 쉽게 확인할 수 있습니다. 그러면 문제를 쉽게 찾을 수 있습니다.

+0

낚싯대가 아닌 물고기가 여기에 있습니다. –

0

귀하의 this 키워드에 이상이 있다는 가정하에 정확합니다. 자바 스크립트에서 this 조금 까다 롭습니다, 그래서 특히 setTimeout 또는 setInterval와 기능 (그것을 사용하는 것은 위험합니다.

은 무엇 당신이 원하는 것은 당신이 기능을 만들 때 this의 값을 저장합니다.

여기에 자세한 내용입니다 : 일부 기능이를 사용할 때 http://justin.harmonize.fm/index.php/2009/09/an-introduction-to-javascripts-this/

0

어쩌면 이러한 의견은 올바른 방법

var theTime; // global variable 
function changeTime() { 
    theTime = setTime(time); // theTime is global variable declared above (accesible from anywhere) 
    // var myTime = setTime(time); // myTime is local variable 
    time.setSeconds(time.getSeconds()+1); 
    p1.html(theTime); 
} 
interval = setInterval(changeTime, 1000); // no braces 
+0

'time.getSeconds()'가'60'이면 조심하십시오.'time.setSeconds (61);' –

+0

@Imre L : ... 어떤 것이 완벽합니까? –

+0

대답 해줘서 고마워. 그러나, 나는 그것을 얻지 않는다? 귀하의 코드에서 함수 내에서 "theTime"변수를 선언하고 있습니다. 함수를 호출하지 않을 때 다른 (프로토 타입) 함수에서 어떻게 접근 할 수 있습니까? – holyredbeard

0
:
this.theTime 

그래서 결과가 같은 것을 할 수 있습니다 : 당신이 사용할 필요가 없습니다

하나의 해결책은 두 경우 모두 theTime 세계를 만드는 것입니다

제이슨, 당신의 설명을 한 후에, 당신에게 설명하려고하는 완전히 새로운 대답을 제공하는 것이 더 낫다고 믿습니다. stateme JS에서 가능한 한 좋은 (간단한) nt. 나는 그것이 도움이되기를 바랍니다.

<html> 
<body> 
<div id="output1"></div> 
<div id="output2"></div> 
<script> 
// theTime is undefined in global scope 

function obj(target) { 
    var theTime = 0; 
    var that = this; // var means "private" 
    this.changeTime = function() { // here "this" points to obj and means "public" 
    theTime++; // no var => outer scope = obj scope 
    // here "this" points to changeTime function, not to obj! 
    // "that" points to obj, you may use that.theTime 
    document.getElementById(target).innerHTML = theTime; 
    } 
} 

var o1 = new obj("output1"); 
var o2 = new obj("output2"); 

setInterval(o1.changeTime,1000); // update output1 content every second 
setInterval(o2.changeTime,500); // update output2 content twice a second 
</script> 
</body> 
</html> 
+0

의견이 지나치게 단순화되어 있으므로 JS 괴짜하시기 바랍니다. –

관련 문제