吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 642|回复: 14
收起左侧

[已解决] JavaScript代码题

[复制链接]
追忆失去的时间 发表于 2023-2-17 14:26
本帖最后由 追忆失去的时间 于 2023-2-17 18:16 编辑
var data = [];

for (var i = 0; i < 3; i++) {
  data[i] = function () {
    console.log(i);
  };
}

data[0]();
data[1]();
data[2]();


请问一下,这段代码为什么会输出3,3,3呢,初学者不太明白

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

niufei58666 发表于 2023-2-17 14:39
由于i使用var声明的,js中for循环是不构成代码块的,也就是在for里面声明的是全局变量。而每一次点击都会调用这个匿名函数,匿名函数中要引用变量i,但匿名函数中却没有找到,只能向上一层找,就找到了全局变量i,这时经过i++,i已经变成了3.所以不管点击哪个都只会弹出3。 解决方法你换成let ,使用let声明变量,let会使for循环构成块级作用域,这个变量只存在于当前的作用域, 就会输出1 2 3 了
zxl1227 发表于 2023-2-17 14:40
[JavaScript] 纯文本查看 复制代码
data[0]();
data[1]();
data[2]();
上面是函数调用,下面是起作用的部分,剩余部分几乎没用
data[i] = function () {
    console.log(i);
  };
clddup 发表于 2023-2-17 14:43
Pwaerm 发表于 2023-2-17 14:43
相当于
[Asm] 纯文本查看 复制代码
var data = [];
for (var i = 0; i < 3; i++) {  
}

data[0] = function () {
    console.log(i);
};
data[1] = function () {
    console.log(i);
};
data[2] = function () {
    console.log(i);
};
//这里i已经是3,所以下面全部输出3
data[0]();
data[1]();
data[2]();

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
PrincessSnow + 1 + 1 我很赞同!
追忆失去的时间 + 1 + 1 热心回复!

查看全部评分

xi520 发表于 2023-2-17 14:49
4楼正解
你给数组的每个元素定义了一个相同的函数
function () {
    console.log(i);
};

当调用data[0]();data[1]();data[2]();时,其实这时循环已经运行完成  ,i就等于最后的3,所以,调用任何一个数组元素时就全部为3了
 楼主| 追忆失去的时间 发表于 2023-2-17 14:53
zxl1227 发表于 2023-2-17 14:40
[mw_shl_code=javascript,true]data[0]();
data[1]();
data[2]();

谢谢回复,明白了
 楼主| 追忆失去的时间 发表于 2023-2-17 14:55
wangchuanlin 发表于 2023-2-17 14:43
var 改为let 就OK,  JS基础问题, 作用域

谢谢回复,已经明白了
 楼主| 追忆失去的时间 发表于 2023-2-17 14:56
Pwaerm 发表于 2023-2-17 14:43
相当于
[mw_shl_code=asm,true]var data = [];
for (var i = 0; i < 3; i++) {  

谢谢大佬回复,明白了

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
Pwaerm + 1 + 1 我很赞同!

查看全部评分

 楼主| 追忆失去的时间 发表于 2023-2-17 14:58
xi520 发表于 2023-2-17 14:49
4楼正解
你给数组的每个元素定义了一个相同的函数
function () {

谢谢大佬的回复,明白了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 01:26

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表