关于javascript

LXY224 2017-11-08 07:34:00
function foo() { function bar(a) {
i = 3; // 修改for循环所属作用域中的i
console.log( a + i );
}
for (var i=0; i<10; i++) {
bar( i * 2 ); // 糟糕,无限循环了!
} }
foo();

为什么第一次输出3,然后就无限循环输出11
我能够理解循环的原因,因为i被定值为3,但是为什么输出11呢?
请大神们指教一下
...全文
172 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
var变量没有块作用域,所以你的代码等价于下面的
    function foo() {
        var i = undefined/////////////
        function bar(a) {
            i = 3; 
            console.log(a + i);
        }
        for ( i = 0; i < 10; i++) {///////////
            bar(i * 2); 
        }
    }
    foo();


Web开发学习资料推荐
javascript混淆加密
javascript函数属性caller和arguments callee介绍
  • 打赏
  • 举报
回复
i被定值为3,进入for循环执行+1操作变成4,则bar(i*2)被定值为bar(8),输出(a+i)就被定值为11
lolysc 2017-11-08
  • 打赏
  • 举报
回复
了解下闭包知识,函数定义的时候决定作用域。把for循环里的var i 改成 let i ,就会出来 3,5,7,9,。。。。。 function foo() { function bar(a) { i = 3; // 修改for循环所属作用域中的i console.log( a + i ); } for (let i=0; i<10; i++) { bar( i * 2 ); // 糟糕,无限循环了! } } foo();
天际的海浪 2017-11-08
  • 打赏
  • 举报
回复
为什么输出11呢? 1.第一次循环在bar()函数中i被重新赋值为3 2.循环i++,变为4 3.第二次循环i*2传给bar()函数中的a。a的值为8 4.i再次被重新赋值为3 5.输出a+i 就是11 6.之后循环i++,又变为4 回到第3步

87,993

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧