2011-12-19 79 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是默認值,這意味着上述函數不會更新對象屬性。而上述函數中的this.theTime必須是局部變量。

注意:setTime()是存在於與上述函數相同的原型函數中的另一個函數。

+1

什麼是'this'應該設置爲?您的代碼無法正常工作,但不知道如何解決問題是不可能的。這個值是在每個函數調用時設置的;它在任何功能中都不是永久的固定的東西。 – Pointy 2011-12-19 18:59:53

+0

'setTime()'是你寫的函數還是你正在試圖使用JS函數'Date.setTime()'? – 2011-12-19 19:03:41

+0

@JasonCraig我爲你編輯了一些問題,以便清理更多的東西。 – 2011-12-19 19:19:43

回答

1

那麼當你使用這部分功能this正在引用實際上是函數的對象。在這裏:

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

你可以使用這個(MYF作爲構造函數)達到var

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

或者在這裏:

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

這裏var又是myF2的屬性(其正如我所說的不只是一個函數,因爲在JavaScript函數中是對象)。 每次調用myF2時,this.var都會增加並提醒(僅在第一次調用中它將被初始化)。

在第二個函數(在第二個setInterval中使用匿名函數)你做的是一樣的。

一種解決方案是讓theTime全球在這兩種情況下,這樣你就不需要使用:

this.theTime 

那麼結果可能是這樣的:

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

interval = setInterval(changeTime, 1000); 

http://jsfiddle.net/u3EuC/

0

您可以通過書面方式一

debugger; 

設置一個斷點在功能輕鬆驗證。那麼可能很容易找到你的問題。

+0

他們喜歡這裏的魚,而不是釣魚竿 – 2011-12-19 19:04:33

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);' – 2011-12-19 19:13:07

+0

@Imre L:...這是完全可以的 – 2011-12-19 19:20:39

+0

謝謝回答。但是,我不明白嗎?在你的代碼中,你正在函數內部聲明變量「theTime」。當我不從它調用任何函數時,我應該如何能夠從其他(原型)函數中獲得該函數? – holyredbeard 2011-12-19 19:23:01

0

傑森,在您澄清之後,我相信最好給您提供全新的答案,試圖解釋這個的狀態nt在JS中儘可能好(並且簡單)。我希望它有幫助。

<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極客。 – 2011-12-20 21:43:24