最近在看 es6 入门教程,在函数的扩展那一章有这样一个例子:
var x = 1; function foo (x, y = function(){x=1;}){ var x = 3; y(); console.log(x); // 3 选择 Javascript 选项 (书中给出的答案是这个) // 1 选择 es6/babel 选项 } foo(); 这个例子我是在 jsbin 上测试的,
jsbin 的 js 代码填写处出可以选择 Javascript 或者 es6/babel ,
我选择 Javascript 选项时上面的例子会输出打印 3 ,选择 es6/babel 选项时打印 1
我想知道为什么这两个选项在处理 js 代码时又怎样的区别?
假设以 Javascript 那个选项的为标准 这个例子为什么最后会打印出 3 ?
我个人的理解是(有错误希望能指出):赋予 y 变量的那个匿名函数在声明(定义?)时 foo 函数的作用域还未形成,也就是说在 foo 函数执行前,创建 foo 函数的执行上下文的时候,先完成 foo 函数中的参数声明,第一个参数是 X ,此时 x 赋值为 undefined ,第二个参数是 y , y 赋值为一个匿名函数,并且这个匿名函数在这个时候被声明(定义?),此时这个匿名函数保存了自己的作用域链,这个作用域链包含它自身声明的变量及 foo 函数参数中的 x ,还有 window 的活动对象。完成了参数变量的声明和赋值后,接下来是函数声明,然后时变量声明,这时新声明的 x 将参数声明中的 x 覆盖了,所以最后打印了 3 。
