javascript - 大家帮我看一下这个JS输出的题目,蒙圈中。。。。
高洛峰
高洛峰 2017-04-11 13:21:55
[JavaScript讨论组]

下面这段代码:

var a = 0, b = 0, c = 0;
var fn = function(b){
    return function(c){
        console.log(a++,b++,c++);
    }
}

var fn1 = fn(a);
fn1(b);

var fn2 = fn(c);
fn2(a);
fn2(b);

输出的结果为:
0 0 0
1 0 1
2 1 0

为什么是这个结果呢?真的是不理解。路过的帮忙解释一下,谢谢!

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(1)
高洛峰
var a = 0,
  b = 0,
  c = 0;
var fn = function(b) {
  return function(c) {
    console.log(a, b, c);
    a++;
    b++;
    c++;
  }
}

var fn1 = fn(a);
// 没啥好说的全部打印 0
fn1(b);

// c为0,因为fn函数内部的++操作并不会影响外部的变量
var fn2 = fn(c);
// a为1,因为fn内部并没有a变量,所以a++操作是指向的外部变量
// 此时a作为参数传递,在回调函数中变量为c所以在,回调函数中a,c都是为1的
fn2(a);

// 此时fn函数中的b为1,因为fn的上下文是存在的,上一次调用的fn2函数时b++,影响此时还是有效的
// b为0,因为回调函数内部的b++操作并不影响外部变量
// a前面已经执行了2次++操作所以为2
fn2(b);

把程序稍微修改一下,看得会比较容易一点。这个示例主要是因为外部的变量与函数内部的变量命名相同,理解起来有点绕。
需要好好理解一下变量的作用域。

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

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