Javascript 变量内部的代码在未被调用的情况下激发?

Javascript 变量内部的代码在未被调用的情况下激发?,javascript,Javascript,我在网上找到了下面的代码,在我的网站上插入了一个时钟。在startTime()函数的最后一行声明了一个变量t。然而,t中的代码似乎在没有调用t的情况下启动(这是显而易见的,因为时钟在站点中工作得很好) 为什么这个代码能工作 通过将函数赋值为变量,我知道这些函数不会在赋值时触发,但需要调用。我还尝试了下面的代码,没有将setTimeout分配给t,它也可以工作。将其指定给变量有什么意义 我是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(startTime,500),然后
  • 调用函数(等待500毫秒,然后调用startTime)
  • 获取一个结果,该结果是计时器的id
  • 将该id分配给t
  • 摘要

    函数实际上会在赋值时触发,因此可以对其求值以返回赋值给变量的值


    希望清除它!

    调用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链接。您的答案基本上还是错的。