共计 1626 个字符,预计需要花费 5 分钟才能阅读完成。
前言
大家好,我是林三心,用最通俗易懂的话讲最难的知识点 是我的座右铭,根底是进阶的前提 是我的初心。
首先阐明这不是题目党,是真的,这道题席卷了几十个群,能答复进去的人是微不足道,最初连 王红元老师 都亲自露面解答了这道题。
题目
先来看看这道题长什么样吧
var x = 1;
function f(x, y = function () {x = 3; console.log(x); }) {console.log(x)
var x = 2
y()
console.log(x)
}
f()
console.log(x)
// //1、下面的代码输入的是什么?// //2、如果把 var x = 2 正文掉,输入的又是什么?// //3、如果把 f 函数第一个参数 x 改成 xx,输入的又是什么?// //4、如果把 f 函数第一个参数 x 设置了默认值为 4,输入的又是什么?
第一题
其实第一题就曾经有很多同学答错了,可能同学们会得出两种答案
- 1、
undefined、3、3、1
- 2、
undefined、3、2、3
其实艰深点就是两种想法
- 1、参数 y 这个函数里的
x = 3
扭转的是全局
的x
- 2、参数 y 这个函数里的
x = 3
扭转的是函数 f 外部
的x
但其实这两种想法都是错的,因为大部分同学只看到了两个 x
- 1、全局的
x
- 2、f 函数外部的
x
但其实漠视还有另一个 x
- 3、f 函数的参数
x
这是解题的要害,来看看 王红元老师 的解说吧
也就是其实 参数 y 函数
里 x = 3
其实扭转的是 f 函数
的 参数 x
,而不是 全局 x
或者 f 函数外部 x
所以正确的输入应该是 undefined、3、2、1
var x = 1;
function f(x, y = function () {x = 3; console.log(x); }) {console.log(x) // 参数 x 没有默认值,所以:undefined
var x = 2
y() // 扭转的是参数 x,且输入参数 x,所以:3
console.log(x) // 输入的是部分 x,所以:2
}
f()
console.log(x) // 全局 x 无影响,所以:1
第二题
第二题就简略多了,去掉 var x = 2
之后,那 f 函数
外部就是有一个 x
,那就是 参数 x
,所以 f 函数
外部 console.log(x)
都是依据 参数 x
实时的值来输入的
var x = 1;
function f(x, y = function () {x = 3; console.log(x); }) {console.log(x) // 参数没有默认值,所以:undefined
// var x = 2
y() // 扭转参数 x = 3,且输入参数 x,所以:3
console.log(x) // 实时参数 x 的值,所以:3
}
f()
console.log(x) // 全局 x 无影响,所以:1
第三题
第三题,把 参数 x
改成了 参数 xx
,那么 参数 y 函数
的 x = 3
扭转的就是 全局 x
,因为 参数 x
没了,又因为就近准则, y 函数
里的 x
就是指向 全局 x
var x = 1;
function f(xx, y = function () {x = 3; console.log(x); }) {console.log(x) // var 变量晋升但未赋值,所以:undefined
var x = 2
y() // x = 3 扭转的是全局 x,且输入全局 x,所以:3
console.log(x) // x = 3 扭转的是全局 x,与部分 x 无关,所以:2
}
f()
console.log(x) // 全局 x 被 y 函数扭转了,所以:3
第四题
第四题,是让 参数 x
默认等于 4
,那其实跟第一题的差异就是 参数 x
有无默认值
var x = 1;
function f(x = 4, y = function () {x = 3; console.log(x); }) {console.log(x) // 参数 x 默认值,所以:4
var x = 2
y() // 扭转的是参数 x = 3,且输入参数 x,所以:3
console.log(x) // 输入的是部分 x,所以:2
}
f()
console.log(x) // 全局 x 无影响,所以:1
结语
如果你感觉此文对你有一丁点帮忙,点个赞,激励一下林三心哈哈。或者能够退出我的摸鱼群,咱们一起好好学习啊啊啊啊啊啊啊,我会定时模仿面试,简历领导,答疑解惑,咱们互相学习共同进步!!
正文完
发表至: javascript
2021-11-28