最近在看 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 。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.