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

JavaScript的循环问题?

郁权
2023-03-14
问题内容

我有以下代码片段。

function addLinks () {
    for (var i=0, link; i<5; i++) {
        link = document.createElement("a");
        link.innerHTML = "Link " + i;
        link.onclick = function () {
            alert(i);
        };
        document.body.appendChild(link);
    }
}

上面的代码用于生成5个链接,并将每个链接与警报事件绑定以显示当前链接ID。但这是行不通的。当您单击生成的链接时,它们都说“链接5”。

但是以下代码段符合我们的预期。

function addLinks () {
    for (var i=0, link; i<5; i++) {
        link = document.createElement("a");
        link.innerHTML = "Link " + i;
        link.onclick = function (num) {
            return function () {
                alert(num);
            };
        }(i);
        document.body.appendChild(link);
    }
}

这里引用了以上两个片段。

但是它是如何工作的以及 关闭 是如何工作的,这些都是我无法理解的。为什么第一个不起作用而第二个却起作用?任何人都可以对魔术进行详细说明吗?

谢谢。


问题答案:

解释第一个示例:

JavaScript的作用域是函数级的,而不是块级的,创建闭包只是意味着将封闭范围添加到封闭函数的词法环境中。

循环终止后,函数级变量i的值为5,这就是内部函数所看到的。

在第二个示例中,对于每个迭代步骤,外部函数文字将评估为具有自己的作用域和局部变量的新函数对象num,其值设置为的当前值i。正如num从未修改过的那样,它将在闭包的整个生命周期中保持不变:由于函数对象是独立的,下一个迭代步骤不会覆盖旧值。

请记住,这种方法效率很低,因为必须为每个链接创建两个新的功能对象。这是不必要的,因为如果您使用DOM节点进行信息存储,则可以轻松共享它们:

function linkListener() {
    alert(this.i);
}

function addLinks () {
    for(var i = 0; i < 5; ++i) {
        var link = document.createElement('a');
        link.appendChild(document.createTextNode('Link ' + i));
        link.i = i;
        link.onclick = linkListener;
        document.body.appendChild(link);
    }
}


 类似资料:
  • 想循环上传每个文件,循环第一次时isrepeat参数为true,拿到第一次循环上传成功后台返回的路径,作为往下循环的pathList,并且往下循环isrepeat参数为false,思路有点凌乱乱...

  • elementplus表格,如下图有两条数据,每行有多个city和address循环展示在一行,前端该怎么处理呢,返回数据格式如下

  • 我是java的新手,我正在编写这个简短的程序,您可以在其中猜测1到10之间的数字。正确的数字存储为整数。如果您猜测较低的数字,它应该说“正确的数字较高”,如果您猜测较高,它应该说“正确的数字较低”。这是我所拥有的: 所以很明显这是行不通的,因为如果你输入一个更小的数字,它会跳到下一个数字,即使这个数字更大,它也是正确的。那么,我如何解决这个问题,让它检查两个语句呢?抱歉解释得不好。谢了。

  • 我已经创建了一个字符串数组,其中包含单词“磅”、“美元”和“欧元”,我想把这些标签放在旗帜的左边(为了用户应用程序的清晰性,因为不是每个用户都知道哪个货币属于哪个国家)。 我创建了一个循环,将创建一个标签,并将其分配到旗帜的左侧,它应该使一个"英镑"标签,然后一个"美元",然后一个"欧元"每次穿越Y轴南部,使他们与旗帜对齐然后,它将重置数组计数以返回到正确的字符串,沿着x轴移动并再次重复。然而,它

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

  • 主要内容:JS break 语句,JS continue 语句,JavaScript 标签通过前面对循环的学习我们知道,默认情况下循环会在表达式结果为假时自动退出循环,否则循环会一直持续下去。某些情况下,我们不用等待循环自动退出,可以主动退出循环,JavaScript 中提供了 break 和 continue 两个语句来实现退出循环和退出(跳过)当前循环,下面我们就来详细介绍一下。 JS break 语句 在学习《 JS switch case语句》时我们已经简单了解过了 break