为什么 setTimeout 回调中的变量没有预期值?

2024-04-21

<div id="image_cont">
  <img src="images/pic1.jpg" alt="pic1" />
  <img src="images/pic2.jpg" alt="pic2" />
  <img src="images/pic3.jpg" alt="pic3" />
</div>

$(document).ready(function() {
    slide(3, "image_cont", 5000, 600);
});

function slide(numberOfImages, containerId, timeDelay, pixels) {
    //start on first image
    var i = 0;
    var style = document.getElementById(containerId).style;
    window.setInterval(function() {
        if (i >= numberOfImages){
            i = 0;
        }
        var marginLeft = (-600 * i);
        var pixelMovement = pixels/15;


////////////////////////////////////////LOOK HERE//////////////////////////////


        for (var j = 0; j * pixelMovement < 600; j++){
            window.setTimeout(function(){
//alert('marginLeft: ' + marginLeft + ' j: ' + j + ' pixelMovement: ' + pixelMovement);
//this alert shows j is 15 when it should be 0, what's going on?


/////////////////////////////////////////END//////////////////////////////////
                style.marginLeft = (marginLeft - j * pixelMovement) + "px";
                }, 150);
        }
        i++;
    }, timeDelay);
}

您不能直接在 setTimeout 函数中使用变量 j ,因为该函数会在您的设置之后运行一段时间for循环已完成,因此 j 具有终止值,而不是调用 setTimeout 时的值。

您可以在 setTimeout 函数中可用的函数闭包中捕获 j 的当前值,如下所示:

for (var j = 0; j * pixelMovement < 600; j++){
    window.setTimeout(function(cntr) {
        return function() {
            style.marginLeft = (marginLeft - cntr * pixelMovement) + "px";
        };
    } (j), 150);
}

我发现这种类型的关闭有点令人困惑。我会尽力解释发生了什么。我们传递到setTImeout()function 执行一个带有一个参数的匿名函数的结果(我在这里将其命名为 cntr),我们传递的值j作为该参数的值。当该函数执行时(现在的值为j在它内部可用),该函数返回另一个匿名函数。这个另一个匿名函数是什么setTimeout当它触发时实际上会调用。但是,第二个匿名函数位于第一个函数的函数闭包内,该函数的捕获值为j在其中(作为我重命名的变量cntrwhile 在函数闭包内以避免解释时混淆)。正是匿名函数让它变得如此混乱,但它确实有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 setTimeout 回调中的变量没有预期值? 的相关文章

随机推荐

  • 如何在多个 HTML 页面上播放背景音频?

    是否有解决方案可以让背景音频 音乐在网站上的多个页面上播放 而无需在每个页面加载时重新启动 该网站当前使用框架集 但我正在寻找替代方案 如果不让整个网站都 AJAX 我认为框架是唯一的方法 如果您需要的话 这里有一个关于制作 ajax 站点
  • JavaScript 多行字符串[重复]

    这个问题在这里已经有答案了 问题是 像在 PHP 中一样将多行字符串存储到变量中的 JavaScript 方法是什么 如果 多行字符串 是指包含换行符的字符串 则可以通过使用转义它们来编写这些字符串 n 对于换行符 var multilin
  • 如何从命令行将 Svelte 文件编译为 JavaScript?

    我是新来的Svelte https svelte dev 快速提问 Svelte 编译器有 CLI 吗 如何访问它 我知道 Svelte 有一个使用 rollup 的预配置设置 但不使用什么 用于构建应用程序 一切都很好 但我只需要 CLI
  • Sublime Text 2 在 Java 开发方面是否胜过 Eclipse [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 是时候使用 Django 1.5 了吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • a += b 与 a = a + b 不同[重复]

    这个问题在这里已经有答案了 可能的重复 为什么 在列表上表现异常 https stackoverflow com questions 2347265 why does behave unexpectedly on lists 今天我发现了P
  • C++ 编译器会优化重复的函数调用吗?

    编译器 通常或特别 是否优化重复的函数调用 例如 考虑这种情况 struct foo member type m return type f const returns by value 函数定义在一个翻译单元中 return type f
  • 使用样式化组件设置滑块拇指样式

    我正在尝试使用 React 的样式组件来设置滑块的样式 但我不知道如何设置拇指的样式 我有一个看起来像这样的CSS faderInput webkit slider thumb webkit appearance none width 15
  • Javascript C++ 绑定?

    我有一些 C 代码想要公开给 Web 应用程序的客户端 理想情况下 我想为我的 C 类编写 Javascript 包装对象 以便我可以在客户端使用它们 这以前做过吗 有谁有链接来展示如何实现这一目标 有一个库可以将 C 代码转换为 java
  • 是否可以使用 JNI 在 C 或 C++ 中实现 Java 接口?

    假设一个 Java 库包含一个类 我们称它为Foo 该类包含一个构造函数和两个方法 constructor Foo returns a random int public int bar generates a random int x a
  • 泛型和(超级?)类型标记可以帮助构建类型安全的新闻聚合器吗?

    我有这个基本的News界面 interface News String getHeader String getText 和具体的类 如SportsNews and FinancialNews提供具体方法 例如getStockPrice g
  • 如何为DialogFragment设置主题

    有人可以解释一下为什么这个声明效果很好 setStyle DialogFragment STYLE NO TITLE android R style Theme Holo 并且下一个声明没有传递 setStyle DialogFragmen
  • Python/vtk - 在 vtkPolyData 对象中单独设置每个点的大小?

    我使用以下代码来填充点云 如何在vtk中以不同的颜色显示点云 https stackoverflow com questions 7591204 how to display point cloud in vtk in different
  • 命名空间中的特殊字符

    我正在考虑在自定义框架的命名空间中使用带有变音标记的字符 例如 这个想法是作为区分产品的一种方式而提出的 但我想确定这不是一个坏主意 如果有什么关于它的事情 稍后会回来咬我 我在搜索中没有看到使用特殊字符的名称空间的其他示例 也没有看到有关
  • 我可以使用 Twig 将 html 放入 Symfony 表单按钮中吗?

    我试图将 html 放入带有树枝的表单按钮中 例如 form widget form jiraStatus label i class fa fa bug i Bug attr class btn btn large btn default
  • 伊斯坦布尔纽约排除测试文件

    我目前正在最终报道中获取我的测试文件 这可能是因为它们与我的组件并排放置 而不是拥有自己的组件test文件夹 我怎样才能将这些排除在承保范围之外 我已经安装了istanbul and nyc我正在使用mocha 我的脚本如下所示 test
  • NetLogo:如何对列表执行多项操作(查找、获取、替换、删除、搜索列表中的元素,......)

    我是 NetLogo 的新手 我想知道是否有对列表进行操作的完整参考 除了 Netlogo 字典之外 我还阅读了这里的大部分帖子 但例如 如果我需要一个数字对列表 例如 1 2 2 2 2 3 当我搜索时 member 3 thislist
  • 无法访问“https://github.com/Homebrew/brew/”:LibreSSL SSL_connect

    我无法在 MacBook Pro Catalina 操作系统 中安装 Home brew 我尝试过使用 home brew 网站中的当前命令 bin bash c curl fsSL https raw githubusercontent
  • 如何检查 SQL Server 表中是否存在列

    如果特定列不存在 我需要添加它 我有类似以下的内容 但它总是返回 false IF EXISTS SELECT FROM INFORMATION SCHEMA COLUMNS WHERE TABLE NAME myTableName AND
  • 为什么 setTimeout 回调中的变量没有预期值?

    div img src images pic1 jpg alt pic1 img src images pic2 jpg alt pic2 img src images pic3 jpg alt pic3 div document read