Rumah  >  Soal Jawab  >  teks badan

javascript - 为什么我把一个setTimeout语句赋值给一个变量,它会执行呢?

var momement = setTimeout(function(){document.write(222222222222);},1000)
//事实上用控制台调试的话他会执行,而不是所谓的我想当然以为是保存一个值而没有执行它。

迷茫迷茫2749 hari yang lalu1496

membalas semua(11)saya akan balas

  • PHP中文网

    PHP中文网2017-04-10 16:43:55

    确实会调用,你写了1000毫秒。1秒钟之后会被调用,这个语句是正确的。
    setTimeout返回的值是一个句柄,可以用来取消这个setTimeout.

    clearTimeout(momement)

    难道你是想这样:

    //定义
    var momement = function(){ setTimeout(function(){document.write(222222222222);},1000)}
    //调用:
    momement()
    
    // 222222222222

    balas
    0
  • 巴扎黑

    巴扎黑2017-04-10 16:43:55

    你这样做相当于调用setTimeout这个方法,然后把这个方法的返回值给变量momement,当然是会执行这个方法的呀。

    楼主可能是想把一个引用传给momement,你可以这样做:

    function setTimeoutWrapper(){
        setTimeout(function(){
            document.write(222222222222);
        },1000)
    }
    var momement = setTimeoutWraper;

    这样的话,你就可以通过momement()再调用这个方法啦

    balas
    0
  • 迷茫

    迷茫2017-04-10 16:43:55

    为什么不执行,你这样就等于是1000MS后调用了function呢,它返回了一个timeoutID给变量了,可以通过clearTimeout(“momement”)来取消这个Timeout,传入的参数就是之前返回的timeoutID

    balas
    0
  • 大家讲道理

    大家讲道理2017-04-10 16:43:55

    这是函数调用啊,当然执行,如果你想保存为对象的话

    var momement = function() {
        setTimeout(function(){document.write(222222222222);},1000);
        };

    下面的才执行。

    momement()

    balas
    0
  • 巴扎黑

    巴扎黑2017-04-10 16:43:55

    setTimeout执行会返回一个数字,这个数字代表了该延迟定时器的唯一身份。
    因此,我们在调用setTimeout和setInterval的时候,常常会定义一个变量来保存这个数字。

    var timer = setInterval(fn, 2000);

    于是,有了这个标识着他身份的数字,我们想要停止该定时器的时候就很方便了

    clearInterval(timer);

    因此当你想给setTimeout/setInterval保存起来不执行的话,通过这种方式是没办法做到的。[应该也做不到],因此我们通常就是在需要使用定时器的时候,定义它,在不需要的时候,清除他,通过上面的方式就很容易实现。

    balas
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 16:43:55

    没有太多为什么

    因为解释器发现函数名后面带()就会直接调用该函数

    不管你是什么setTimeout还是什么alert

    (function(){
        return alert(2)
    })();
    
    var i = alert(3)

    balas
    0
  • PHP中文网

    PHP中文网2017-04-10 16:43:55

    好吧,我看到大家对于这个回答都不标准,只说中了那么一点。
    我在这里补充一个匿名函数的知识,
    请参考我以前的回答:js的回调函数一般都用来做什么

    哦,对了,应该是回答为什么把setTimeout赋值给一个变量会执行

    var timeout = setTimeout(function() {alert('good');},10000);

    在这里,告诉程序10s钟之后执行function() {alert('good'); },在这里setTimeout会产生一个句柄赋值给timeout
    假设我们突然在10s钟之内不想执行了,
    我们可以

    clearTimeout(timeout); //根据句柄清除setTimeout,这样就不会执行了。

    对了,我这里给一个例子:
    var t1 = setTimeout(function() {

    alert('我这里是10s后执行的程序');

    },10000);
    setTimeout(function() {

    clearTimeout(t1);
    alert('我这个是5s后执行的程序,我这里清除了10s后执行的程序');

    },5000);

    balas
    0
  • 迷茫

    迷茫2017-04-10 16:43:55

    执行。

    函数名加括号这种形式只要前面没有function关键字就立即执行。

    setInterval也是一样。

    var iTime =setInterval(.....)

    这样,只不过函数的返回值赋给了变量罢了。

    balas
    0
  • PHPz

    PHPz2017-04-10 16:43:55

    这个问题没必要说那么多。

    首先你要明白setTimeout是一个函数,在函数后面加一个括号叫做函数调用表达式,就代表调用这个函数。而调用setTimeout这个函数的结果就是若干时间后打印那些东西。

    你把setTimeout(…)赋值给另一个变量,只是把函数调用的结果(即返回值)给了那个变量,setTimeout函数的返回值是一个整数。

    最后我再纠正题主问题标题里的一个错误吧:那不叫把setTimeout语句赋给变量,你可以说表达式。语句是没有值的,也没法赋值给别人。

    balas
    0
  • 高洛峰

    高洛峰2017-04-10 16:43:55

    首先,setTimeout是一个函数,后面加了一个括号,执行这个函数,之行结束后,返回的值赋给变量

    balas
    0
  • Batalbalas