刚刚看阮一峰的ES6文章时,产生了一个疑问,关于函数参数默认值作用域的。
第一段: var x = 3
var x = 1;
function foo(x, y = function() { x = 2; }) {
var x = 3;
y();
console.log(x);
}
foo() // 3
x // 1
第二段: x = 3
var x = 1;
function foo(x, y = function() { x = 2; }) {
x = 3;
y();
console.log(x);
}
foo() // 2
x // 1
针对这种不同,阮老师给出的解释是这样的:
大家是如何理解第一种情况的?
参考地址:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
参数自己整体是一个“块”,仅此而已。你通过断点单步搞明白代码执行的流程,剩下的就是 闭包行为 ,变量名“逐级向上”,直到
global
。扯那么多没用的 ……这相当于有3个上下文对应3个作用域,
全局上下文 ----- > 行参上下文 ----- > 函数内部的局部上下文。
第一种情况,当执行
y();
相当于在 行参上下文对应的作用域中执行 ,不会影响 函数内部的局部上下文对应的作用域,所以x
还是3。var x = 1;
function foo(x, y = function() { x = 2; }) {
x = 3;
debugger
y();
console.log(x);
}
foo() // 2
x // 1
与
var x = 1;
function foo(x, y = function() { x = 2; }) {
x = 3;
debugger
console.log(x);
}
foo() // 3
x // 1
比较打个断点;看一下函数的执行过程;就明白了
你可以把他想象成有三个作用域:
第一次声明是在全局的,第二次在函数参数中声明相当于执行了一次let x和let y =...;第三次是在函数内部中,如果再一次使用了var对x进行声明,那么和参数中的x就不是一个变量,如果没有进行声明,则会沿着作用去找上级的x,这里就找到了函数参数中的x;
我也想不明白这一点,楼主懂了吗?可以解释一下不??