当前位置: 首页 > 知识库问答 >
问题:

Javascript设置超时和循环[重复]

和谦
2023-03-14

专家。Javascript没有产生期望的延迟效果<从其他问题开始,我知道,问题在于settimeout和我使用它的方式。但我仍然无法理解Settimeout是如何工作的。所以我把代码放在这里。出于知识目的,只需要使用Javascript
事实上,我正试图用javascript来澄清我关于这个闭包的概念。它们是Javascript中扭曲的东西吗?

var objImg = new Object();
var h;
var w;

var no = 100;
while (no != 500) {
    setTimeout(function () {
        size(no, no);
    }, 2000);

    /* it's get executed once, instead of repeating with while loop
    Does it leave loop in mid? I get image with 500px height and
    width, but effect is not acheived.
    */

    no = no + 50;
}

function size(h, w) {
    var objImg = document.getElementsByName('ford').item(0);
    objImg.style.height = h + 'px';
    objImg.style.width = w + 'px';
}

共有3个答案

司马羽
2023-03-14

您的问题在于size()函数语法

var objImg = new Object();
var h;
var w;

var no = 100;

var int = window.setInterval(function () {
    size(no,no);
    no += 50;
},2000)

function size(h, w) {
    if (h == 500){
        window.clearInterval(int);
        return;
    }
    var height = h + 'px';
    var width = w + 'px';
    document.getElementsByName('ford').item(0).style.height = height;
    document.getElementsByName('ford').item(0).style.width = width;
}

http://jsfiddle.net/AQtNY/2/

高山
2023-03-14

为什么不直接使用setInterval()呢?

var objImg = new Object();
var h;
var w;

var no = 100;
var myInterval = window.setInterval(function() {
    size(no, no);
    no = no + 50;
    if (no >= 500) clearInterval(myInterval);
}, 2000);

function size(h, w) {
    var objImg = document.getElementsByName('ford').item(0);
    objImg.style.height = h + 'px';
    objImg.style.width = w + 'px';
}
邹英悟
2023-03-14

你有两个问题:

  • no在调用回调时将具有循环结束的值
  • 你正在编程所有的超时2000毫秒,从同一时间,循环运行的时间。

以下是你如何解决这个问题:

var t = 0
while (no != 500) {
   (function(no) {
      t += 2000;
      setTimeout(function() { size(no,no);} ,t);
   })(no);
   no  = no+50; // could be written no += 50
}

立即执行的函数创建一个范围来保护no的值。

关于(函数(no){)的一点说明:

变量的作用域是

  • 全球范围

上面的代码可以写成

var t = 0
while (no != 500) {
   (function(no2) {
      t += 2000;
      setTimeout(function() { size(no2,no2);} ,t);
   })(no);
   no += 50;
}

这里可能更清楚的是,我们有两个变量:

  • no,其值随着每次迭代而变化,当调用超时时为500
  • no2,实际上是一个变量no2每次调用内部匿名函数

每次调用内部匿名函数时,它都会声明一个新的no2变量,其值在调用时(迭代期间)为no。因此,该变量no2受到保护,并由setTimeout的回调使用。

 类似资料:
  • 问题内容: 我希望我的for循环不应该一次执行,而要在每次迭代后等待超时。例如: 我发现了很多关于堆栈溢出的解决方案,例如: 但是在所有实现中,循环最初等待3000毫秒,然后立即执行整个循环。有没有一种方法可以等待1000毫秒后调用每次迭代。 问题答案: 您可以使用简单的数学方法来解决: 1000ms:0 4000ms:1 7000ms:2 10000ms:3 13000ms:4 … 跟随评论 您

  • 问题内容: Firefox总是加载动态图像,但是IE只是显示图像而没有任何动态动作。我需要做些什么改变? IE查看源代码中的JavaScript代码: 我正在使用Wicket框架,所以真正的Java代码是: 加载我的动态图像的html页面是: 问题答案: 解决了我的问题。可能对其他人有用: 回答: HTML源代码: HTML:

  • 网络编程中经常使用gethostbyname和getaddrinfo来实现域名解析,这两个C函数并未提供超时参数。实际上可以修改/etc/resolv.conf来设置超时和重试逻辑。 !> 可参考man resolv.conf文档 多个 NameServer nameserver 192.168.1.3 nameserver 192.168.1.5 option rotate 可配置多个names

  • 以上将给出以下随机输出: 任务很简单:确保每个promise只在另一个promise之后运行()。 由于某种原因,我找不到一个方法来做这件事。 我尝试了生成器函数(),尝试了返回promise的简单函数,但最终都归结为同一个问题:循环是同步的。 对于async,我只需使用。 你怎么解决?

  • 问题内容: 专家。JavaScript无法产生所需的延迟效果。 从其他问题上,我因此知道,问题在于settimeout及其使用方式。但是我仍然无法理解Settimeout的工作原理。所以我将代码放在这里。由于知识目的,仅需使用Javascript。 实际上,我正在尝试清除有关 此的 概念,即javascript中的 闭包 。它们是Java的扭曲事物吗? 问题答案: 您有两个问题: 调用回调时将具有

  • 当微服务处理业务逻辑时间过长,网关会报超时错误,默认等待时间是5秒。 可在网关指定spring.cloud.gateway.httpclient.response-timeout参数设置超时时间,单位毫秒 # 设置响应超时10秒 spring.cloud.gateway.httpclient.response-timeout=10000 更多配置参见:org.springframework.cl