持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情
前言
今天没有写博客没有什么思路,于是决定去刷下js题目,做一个题目解析. 错题如下:
选项如下:
1.首次错误思路
- (1)分析结构:
- 开头自定义了一个函数
- 然后声明了一个对象,一个数值变量
- 然后把上面声明的对象和数值变量作为实参传入上边的函数,调用该函数
- 然后控制台输出上面声明的对象和数值
- (2)分析考官意图,题目考察点
- 考察点是 对作用域的理解是否到位
- 函数内是局部作用域,在内部改变参数不会影响到外部的变量
- (3)得出答案
- 虽然函数内对传入的参数进行了修改
- 但是函数内部是局部作用域,内部参数改变了,不影响外部的变量
- 所以我认为原来的两个变量都没有变化,
- 应该选A:{b:0},0
2.本题正确思路
- (1)分析结构:
- 开头自定义了一个函数
- 然后声明了一个对象,一个数值变量
- 然后把上面声明的对象和数值变量作为实参传入上边的函数,调用该函数
- 然后控制台输出上面声明的对象和数值
- (2)分析考官意图,题目考察点
- 考察点是 1.对作用域的理解是否到位.2.对引用类型和普通类型的理解
1.对作用域的理解是否到位:
- 函数内是局部作用域,在内部改变参数不会影响到外部的变量
2.对引用类型和普通类型的理解
- 引用类型存储的是地址,一个地方改变所有的都改变
- 普通类型存储的是值,一个地方改变其他地方不变
- (3)得出答案
- 虽然函数内对传入的参数进行了修改
- 但是函数内部是局部作用域,内部参数改变了,不影响外部的变量
- 但是对象是引用类型,一个地方变化其他地方也会变化,所以对象变化了
- 普通类型一个地方改变其他地方不变,所以数值类型不变
- 应该选B:{b:1},0
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>
- 答案确实为B
4.反思总结
作用域
- 作用域分为全局作用域,局部作用域和块级作用域
- 1.全局作用域在整个script内都可以调用,但是容易被污染
- 2.局部作用域是在函数内部使用,防止被污染
- 3.块级作用域是在大括号内使用,一般是指for循环等非函数的大括号内
引用数据类型和普通数据类型
- 引用数据类型存储的是地址
- 普通数据类型存储的是值