2011-12-19 56 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