搜索
javascript - 这道js题看不懂
某草草
某草草 2017-05-19 10:44:12
[JavaScript讨论组]
function foo() {
    var i = 0;
    return function() {
        console.log(i++);
    }
}

var f1 = foo(), f2 = foo();
f1();
f1();
f2();

为什么结果是0, 1, 0而不是1, 2, 1呢
某草草
某草草

全部回复(9)
给我你的怀抱
console.log(i++)
// 相当于
console.log(i);
i = i+1;
console.log(++i)
// 相当于
i = i+1;
console.log(i);
过去多啦不再A梦

难不成你以为i是全局变量吗。
既然i是局部变量, f1里面的i和f2里面的i有什么关系?

至于为什么是0, 1 而不是1 ,2.
那是因为 i++ 实际上是 i = i + 1;
console.log(i++) , 是先打印了i, 然后才执行的 i = i + 1;
如果你改成 console.log(++i); 那么就是 1, 2了。

高洛峰

这就是 i++ 和 ++i 的区别了,i++是先引用后自增,++i是先自增再引用

PHPz
var a = 42;
a++; //42
a; //43

++a; //44
a; //44
漂亮男人

第一次执行f1的时候,输出0,因为是i++,所以先输出i,后加,再次执行时候,i这时候为1,同理,输出2。执行f2时候,因为i为0,所以输出了0。也就是f1和f2作用域不一样,所以i引用的也就不一样。

習慣沉默

f1()就是执行

    function() {
        console.log(i++);
    }

而i是f1的内部变量 ++之后自然输出 0 , 1

你代码加一行就懂了

function foo() {
    var i = 0;
    console.log(i);
    return function() {
        console.log(i++);
    }
}

新加的console.log只会在 var f1 = foo() 时执行 而f1()不会执行

大家讲道理

i++是先运算后加减,所以先输出0,之后才变为1

阿神

因为++是运算后自加运算符。i会在运算完这条指令后再自加。

高洛峰

0的原因是会先执行console.log然后i再自增,而f1和f2中的i是没有联系的,且因为有闭包的原因,再次执行f1就会得到1。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号