当前位置: 首页 > 面试题库 >

JavaScript变量绑定和循环

卢磊
2023-03-14
问题内容

考虑这样的循环:

for(var it = 0; it < 2; it++)
{
    setTimeout(function() {
        alert(it);
    }, 1);
}

输出为:

=> 2
=> 2

我希望它是:0、1。我看到两种解决方法:

解决方案#1。

这一事实基于我们可以将数据传递给setTimeout的事实。

for(var it = 0; it < 2; it++)
{
    setTimeout(function(data) {
        alert(data);
    }, 1, it);
}

解决方案#2。

function foo(data)
{
    setTimeout(function() {
        alert(data);
    }, 1);
}

for(var it = 0; it < 2; it++)
{
    foo(it);
}

还有其他选择吗?


问题答案:

除了您提出的两种方法外,没有什么其他的,但这是另一种方法

for(var it = 0; it < 2; it++)
{
    (function() {
        var m = it;   
        setTimeout(function() {
            alert(m);
        }, 1);
    })(); 
}

本质上,您需要捕获闭包中的变量值。此方法使用立即调用的匿名函数将it本地变量中的外部变量值捕获m



 类似资料:
  • 问题内容: 我一直在研究用于自动构建的基本测试框架。下面的代码代表使用不同程序对两台机器之间的通信进行的简单测试。在实际执行任何测试之前,我想完全定义它们- 因此,下面的此测试直到声明所有测试后才真正运行。这段代码只是测试的声明。 无论如何,运行测试后,它将运行“ passIf”定义的功能。由于我想为多个客户端运行该测试,因此我要迭代它们并为每个客户端定义一个测试- 没什么大不了的。但是,在第一个

  • Rust 通过静态类型确保类型安全。变量绑定可以在声明变量时标注类型。不过在多数情况下,编译器能够 从字面内容推导出变量的类型,大大减少了标注类型的负担。 使用 let 绑定操作可以将值(像具体数据)绑定到变量中。 fn main() { let an_integer = 1u32; let a_boolean = true; let unit = (); // 将

  • 变量绑定默认是不可变的,但加上 mut 修饰语后变量就可以改变。 fn main() { let _immutable_binding = 1; let mut mutable_binding = 1; println!("Before mutation: {}", mutable_binding); // 正确代码 mutable_binding += 1

  • 事实上每一个非“Hello World” Rust 程序都用了变量绑定。他们将一些值绑定到一个名字上,这样可以在之后使用他们。let被用来声明一个绑定,像这样: fn main() { let x = 5; } 在每个例子中都写上fn main() {有点冗长,所以之后我们将省略它。如果你是一路看过来的,确保你写了main()函数,而不是省略不写。否则,你将得到一个错误。 模式(Patt

  • Rust 语言可以先声明变量绑定,后面才将它们初始化。但是这种情况用得很少,因为这样很可能导致使用未 初始的变量。 fn main() { // 声明一个变量绑定 let a_binding; { let x = 2; // 初始化一个绑定 a_binding = x * x; } println!("a bi

  • 问题内容: 我的FXML注入有问题。据我所知,我已经设置了程序,但似乎缺少了一些东西。我的代码如下: 主要: 控制器: FXML文件: 识别我正在注入 noteTree,sp和newNoteButton的字段 。但是,当我尝试将项目加载到树形视图时,我得到了NPE。我确认使用if语句表明我的3个字段是。堆栈跟踪如下: 事实证明我和我的功能都可以通过。 谁能指出我缺少/做错了什么? 问题答案: 您试