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

查看:107
本文介绍了javascript - 刚刚看阮一峰的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

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

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

参考地址:

ECMAScript 6 入门

解决方案

参数自己整体是一个块,仅此而已。你通过断点单步搞明白代码执行的流程,剩下的就是 闭包行为 ,变量名逐级向上,直到 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

这篇关于javascript - 刚刚看阮一峰的ES6文章时,产生了一个疑问,关于函数参数默认值作用域的。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆