刚刚看阮一峰的ES6文章时,产生了一个疑问,关于函数参数默认值作用域的。

发布于 2022-09-05 08:39:19 字数 638 浏览 14 评论 0

第一段: 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

针对这种不同,阮老师给出的解释是这样的:

clipboard.png

大家是如何理解第一种情况的?

参考地址:

ECMAScript 6 入门

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

最美不过初阳 2022-09-12 08:39:19

参数自己整体是一个“块”,仅此而已。你通过断点单步搞明白代码执行的流程,剩下的就是 闭包行为 ,变量名“逐级向上”,直到 global 。扯那么多没用的 ……

debugger;
var x = 1;
var a = 999;
function foo(x,
             y =
               function() {
                 debugger;
                 console.log(x)  // 12
                 x = 22;
                 console.log(a) // 999
                 a = 8;
                 console.log(a) // 8
                 z = 123;
                 return function(){ return x }
               }
               )
{
  debugger;
  var x = 3;
  var a = 0;
  var f = y();
  console.log(f()); // 22
  console.log(x);  // 3
}

foo(12)
console.log(x) // 1
console.log(a) // 8
console.log(global.z) // 123
林空鹿饮溪 2022-09-12 08:39:19

这相当于有3个上下文对应3个作用域,

全局上下文 ----- > 行参上下文 ----- > 函数内部的局部上下文。

第一种情况,当执行 y();相当于在 行参上下文对应的作用域中执行 ,不会影响 函数内部的局部上下文对应的作用域,所以 x还是3。

小嗲 2022-09-12 08:39:19

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
比较打个断点;看一下函数的执行过程;就明白了

傲影 2022-09-12 08:39:19

你可以把他想象成有三个作用域:
第一次声明是在全局的,第二次在函数参数中声明相当于执行了一次let x和let y =...;第三次是在函数内部中,如果再一次使用了var对x进行声明,那么和参数中的x就不是一个变量,如果没有进行声明,则会沿着作用去找上级的x,这里就找到了函数参数中的x;

var x = 1;
function foo(x, y = function() { x = 2; }) { // 相当于 {let x; let y = function () { x = 2}}
  var x = 3;    // 再次声明x,此时x已经不是参数中的x
  y();
  console.log(x);
}

foo() // 3
x // 1
var x = 1;
function foo(x, y = function() { x = 2; }) { // 相当于 {let x; let y = function () { x = 2}}
  x = 3;    // 沿着作用域链找到参数中的x,则参数中的 y = function () { x = 2} 与这里的x与参数的x是同一个变量
  y();
  console.log(x);
}

foo() // 2
x // 1
烈酒灼喉 2022-09-12 08:39:19

我也想不明白这一点,楼主懂了吗?可以解释一下不??

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文