加强对作用域和数据类型存储方式的理解

65 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情

前言

今天没有写博客没有什么思路,于是决定去刷下js题目,做一个题目解析. 错题如下:

image.png

选项如下:

image.png

1.首次错误思路

  • (1)分析结构:
  • 开头自定义了一个函数
  • 然后声明了一个对象,一个数值变量
  • 然后把上面声明的对象和数值变量作为实参传入上边的函数,调用该函数
  • 然后控制台输出上面声明的对象和数值
  • (2)分析考官意图,题目考察点
  • 考察点是 对作用域的理解是否到位
  • 函数内是局部作用域,在内部改变参数不会影响到外部的变量
  • (3)得出答案
  • 虽然函数内对传入的参数进行了修改
  • 但是函数内部是局部作用域,内部参数改变了,不影响外部的变量
  • 所以我认为原来的两个变量都没有变化,
  • 应该选A:{b:0},0

image.png

2.本题正确思路

  • (1)分析结构:
  • 开头自定义了一个函数
  • 然后声明了一个对象,一个数值变量
  • 然后把上面声明的对象和数值变量作为实参传入上边的函数,调用该函数
  • 然后控制台输出上面声明的对象和数值
  • (2)分析考官意图,题目考察点
  • 考察点是 1.对作用域的理解是否到位.2.对引用类型和普通类型的理解
  • 1.对作用域的理解是否到位:
  • 函数内是局部作用域,在内部改变参数不会影响到外部的变量
  • 2.对引用类型和普通类型的理解
  • 引用类型存储的是地址,一个地方改变所有的都改变
  • 普通类型存储的是值,一个地方改变其他地方不变
  • (3)得出答案
  • 虽然函数内对传入的参数进行了修改
  • 但是函数内部是局部作用域,内部参数改变了,不影响外部的变量
  • 但是对象是引用类型,一个地方变化其他地方也会变化,所以对象变化了
  • 普通类型一个地方改变其他地方不变,所以数值类型不变
  • 应该选B:{b:1},0

image.png

3.实际调试一下

    <script>
        function fn(o, val) {
            o.b = 1;
            val = 1;
        }
        var obj = { b: 0};
        var num = 0;
        fn(obj, num);
        console.log(obj, num);
    </script>

image.png

  • 答案确实为B

4.反思总结

作用域

  • 作用域分为全局作用域,局部作用域和块级作用域
  • 1.全局作用域在整个script内都可以调用,但是容易被污染
  • 2.局部作用域是在函数内部使用,防止被污染
  • 3.块级作用域是在大括号内使用,一般是指for循环等非函数的大括号内

引用数据类型和普通数据类型

  • 引用数据类型存储的是地址
  • 普通数据类型存储的是值