You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何需为forEach方法的回调传入多参数才能为DOM元素设置样式?

问题说明

以下代码可以正常运行:

allParagraphs.forEach((p, i) => {
    if(i == 0){
        p.style.fontSize = '100px';
    }else if(i == 1){
        p.style.fontSize = '10px';
    }else if(i == 2){
        p.style.fontSize = '50px';
    }else if(i == 3){
        p.style.fontSize = '25px';
    }
})

但以下两段代码无法运行,具体原因分析如下:

第一段错误代码问题

allParagraphs.forEach((p, i) => {
    if(i == 0){
        i.style.fontSize = '100px';
    }else if(i == 1){
        i.style.fontSize = '10px';
    }else if(i == 2){
        i.style.fontSize = '50px';
    }else if(i == 3){
        i.style.fontSize = '25px';
    }
})
  • i是数组的索引值,属于数字类型,数字本身没有style属性。你要操作的是DOM段落元素,也就是回调函数的第一个参数p(它是allParagraphs数组中的元素),直接给数字i设置style会触发错误。

第二段错误代码问题

allParagraphs.forEach((p, i) => {
    if(p == 0){
        i.style.fontSize = '100px';
    }else if(p == 1){
        i.style.fontSize = '10px';
    }else if(p == 2){
        i.style.fontSize = '50px';
    }else if(p == 3){
        i.style.fontSize = '25px';
    }
})

这里存在两个核心问题:

  1. p是数组中的DOM元素对象,和数字0/1/2/3做相等判断p == 0时,会触发类型转换——DOM对象转数字会得到NaN,而NaN和任何数字都不相等,所以所有if条件都不会被触发。
  2. 即便条件能触发,i仍是数字类型的索引,同样没有style属性,操作它的style依然会报错。

补充说明

forEach的回调函数参数是固定顺序的:第一个参数是当前遍历到的数组元素(此处为DOM段落元素),第二个是元素的索引数字,第三个是原数组。如果想用索引获取元素,应该使用allParagraphs[i],而非直接用i本身,示例如下:

allParagraphs.forEach((p, i) => {
    if(i == 0){
        allParagraphs[i].style.fontSize = '100px';
    }
    // ... 其他逻辑
})

这种写法可以正常运行,但直接使用回调中的p会更简洁。

内容的提问来源于stack exchange,提问作者willy chrosnik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 12:50:22