javascript - 大家帮我看一下这个JS输出的题目,蒙圈中。。。。

查看:75
本文介绍了javascript - 大家帮我看一下这个JS输出的题目,蒙圈中。。。。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

下面这段代码:

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

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

解决方案

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);

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

这篇关于javascript - 大家帮我看一下这个JS输出的题目,蒙圈中。。。。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆