Javascript 变量内部的代码在未被调用的情况下激发?
我在网上找到了下面的代码,在我的网站上插入了一个时钟。在startTime()函数的最后一行声明了一个变量t。然而,t中的代码似乎在没有调用t的情况下启动(这是显而易见的,因为时钟在站点中工作得很好) 为什么这个代码能工作 通过将函数赋值为变量,我知道这些函数不会在赋值时触发,但需要调用。我还尝试了下面的代码,没有将setTimeout分配给t,它也可以工作。将其指定给变量有什么意义 我是javascript新手,所以任何有助于我理解这里发生了什么的解释都会很好 提前谢谢 代码:Javascript 变量内部的代码在未被调用的情况下激发?,javascript,Javascript,我在网上找到了下面的代码,在我的网站上插入了一个时钟。在startTime()函数的最后一行声明了一个变量t。然而,t中的代码似乎在没有调用t的情况下启动(这是显而易见的,因为时钟在站点中工作得很好) 为什么这个代码能工作 通过将函数赋值为变量,我知道这些函数不会在赋值时触发,但需要调用。我还尝试了下面的代码,没有将setTimeout分配给t,它也可以工作。将其指定给变量有什么意义 我是javascript新手,所以任何有助于我理解这里发生了什么的解释都会很好 提前谢谢 代码: 函数开始时间(
函数开始时间(){
var today=新日期();
var h=today.getHours();
var m=today.getMinutes();
var s=today.getSeconds();
m=检查时间(m);
s=检查时间(s);
document.getElementById('timeLink')。innerHTML=“时间:”+
h+“:“+m+”:“+s;
var t=设置超时(开始时间,500);
}
功能检查时间(i){
如果(i<10){i=“0”+i};//在<10的数字前面加零
返回i;
此行:
var t = setTimeout(startTime, 500);
表示在500毫秒延迟后,应调用startTime
函数。由于此代码位于startTime
内,因此该函数变为递归函数。t
变量将接收表示计时器特定实例的数字。如果您希望稍后使用clearTimeout()
函数…将引用传递给要取消的计时器,如下所示:
clearTimeout(t);
window.addEventListener("DOMContentLoaded", function(){
var timeLink = document.getElementById('timeLink');
// Here, the call to start the timer is outside of the function
// so startTime will not be recursive, it will just be called
// repeatedly every 9/10's of a second.
var t = setInterval(startTime, 900);
});
function startTime() {
timeLink.innerHTML = "Time: " + new Date().toLocaleTimeString();
}
查看此小提琴以查看setTimeout()
返回的实际值:
顺便说一句,更简单的时钟代码是:
window.addEventListener("DOMContentLoaded", function(){
var timeLink = document.getElementById('timeLink');
var t = null;
// The parenthesis around this function make it a function
// expression and the extra set of parenthesis at the end
// cause the function to invoke itself. This syntax is also
// known as an "Immediately Invoked Function Expression"
(function startTime() {
timeLink.innerHTML = "Time: " + new Date().toLocaleTimeString();
t = setTimeout(startTime, 900);
}());
});
这段代码每900毫秒更新一次时间,而不是每500毫秒更新一次(因此它调用自己的频率几乎是原来的一半,但仍然保持时间的准确性)
setTimeout()
函数创建一个“一次性”计时器。计时器关闭后,将调用提供的函数引用,这就是它的结束,但在您的情况下,提供的函数引用是包含setTimeout()的函数
,因此在计时器第一次关闭后,它会再次调用当前函数,导致设置另一个“一次性”计时器,以此类推。当函数调用自身时,它被称为“递归函数”
获取此行为的另一种方法是使用setInterval()
,它创建一个重复计时器,在您提供的时间间隔内重复调用其函数。它如下所示:
clearTimeout(t);
window.addEventListener("DOMContentLoaded", function(){
var timeLink = document.getElementById('timeLink');
// Here, the call to start the timer is outside of the function
// so startTime will not be recursive, it will just be called
// repeatedly every 9/10's of a second.
var t = setInterval(startTime, 900);
});
function startTime() {
timeLink.innerHTML = "Time: " + new Date().toLocaleTimeString();
}
不管公认的答案是什么(大部分是错误的),setTimeout()
和setInterval()
都是标准化的,并且已经有一段时间了。从:
当您分配一个变量时,将对右侧进行求值,并将求值结果放入变量中 所以如果你写:
var a = 5 + 6;
function someFunction() {
return 9;
}
var x = someFunction();
然后,解释器将计算5+6,得到结果11,并将a分配给数字11
函数也是如此。如果您编写:
var a = 5 + 6;
function someFunction() {
return 9;
}
var x = someFunction();
解释器将计算someFunction
,调用该函数,得到9的结果,并将变量赋值给9
这也适用于您的示例
var t = setTimeout(startTime, 500);
口译员将:
希望清除它!调用setTimeout(),并将返回值分配给var t。此实例中的返回值是setTimeout实例的唯一ID。
但是,t中的代码似乎在未调用t的情况下启动
您的意思是说startTime()未调用
?可能您希望设置innerText
,而不是innerHTML
,因为如果要设置innerHTML
,您应该提供一个有效的html字符串,例如document.getElementById('timeLink')。innerHTML=“hi”
@hamism.innerText
不是标准的,不能在所有浏览器中使用。.innerHTML
不需要任何HTML(尽管它的名称)在字符串中。@hamism几乎任何HTML元素都只能包含一个文本节点,而不能包含其他元素,因此传入字符串就可以了。@hamism.innerText
不会在所有浏览器中都起作用,.innerHTML
会起作用。.innerText
因此根本不应该使用。两者都setTimeout()
和setInterval()
返回一个表示计时器特定实例的数字。它们总是有。如果您希望使用clearTimeout()
或clearTimeout()停止计时器,则此返回值是必不可少的
。此外,函数不会在赋值时触发。函数是JavaScript中的数据。将函数赋值给变量只会将函数存储在该变量中。你在这里的大多数回答都是错误的。我不知道你为什么一直说这些计时器没有在浏览器之间标准化。它们是。它们在所有现代应用中都是一样的浏览器。请阅读我提供的Mozilla链接。您的答案基本上还是错的。