Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于第八章 函数的扩展 中 的"函数参数默认值是函数情况的讲解"是否有误?? #258

Closed
gaoyangxiaozhu opened this issue Sep 10, 2016 · 4 comments

Comments

@gaoyangxiaozhu
Copy link

gaoyangxiaozhu commented Sep 10, 2016

阮老师,您好!

最近在拜读老师的ES6标准入门这本书。

关于ES6入门这本书第八章中 函数的参数的默认值是函数的情况 书中说

如果参数的默认值是一个函数,该函数的作用域是其声明时所在的作用域 并给出了实例讲解

但经过实践 我认为其实参数的默认值是函数的情况和是其他类型的情况是一样的 即先是当前函数的作用域,然后才是全局作用域

理由如下:

如图所示是书中的讲解代码片段:

书中源码-1

书中说代码运行的结果是outer

但是,本人基于bable编译运行后的结果却是inner

编译后的ES5源码如图所示:
编译后的代码-1

从bable编译后的代码也可以看出,当运行bar函数时,其内部调用func()函数时,沿着原型链查找就能优先在bar函数内部作用域中找到foo变量,并输出为inner 而不是全局作用域中的foo变量

同时书中提到
书中源码-2

但实际bable编译运行后的结果却是inner

其编译后的ES5代码如图:
编译后的代码-2

更复杂的例子:
书中源码-3

编译后的源码如图:
编译后的代码-3

书中说:
上面代码中,函数foo的参数y的默认值是一个匿名函数。函数foo调用时,它的参数x的值为undefined,所以y函数内部的x一开始是undefined,后来被重新赋值2。但是,函数foo内部重新声明了一个x,值为3,这两个x是不一样的,互相不产生影响,因此最后输出3

但是实际基于bable编译运行的结果是2

而且从编译后的js代码也可以看出,解释器在运行时会在原型链中优先找到foo中的x变量 因此匿名函数中的x在原型链的查找过程中实际是指向了foo中声明的x变量,也就是说他们其实是同一个 所以在匿名函数中将2赋值给x会导致foo中的x更新为2。

所以,个人觉得函数的参数的默认值是函数时和其他类型的情况是一样的,都是按原型链查找 ,即先是当前函数的作用域,然后才是全局作用域

我主要是基于bable编译运行后的结果以及编译后的js代码进行测试分析的

并没有从ES6标准实现源码进行分析,所以可能我基于bable编译运行的结果本身就有误??
也就是我是bable编译后的ES5风格的代码有问题??

还请老师能给予解释。

谢谢!

@hax
Copy link

hax commented Sep 11, 2016

书上讲解没有错误。这是babel的bug。

参见 #75

遇到edge case,你可以先在 chrome/ff 等浏览器里直接测。它们已经几乎完整支持ES2015的所有特性了。

@gaoyangxiaozhu
Copy link
Author

恩恩 谢谢阮老师啦!

@ruanyf
Copy link
Owner

ruanyf commented Sep 12, 2016

上面是贺师俊老师回答的啦,不要谢错人。

On Mon, Sep 12, 2016 at 8:55 AM, 高阳阳 notifications@github.com wrote:

恩恩 谢谢阮老师啦!


You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
#258 (comment),
or mute the thread
https://github.com/notifications/unsubscribe-auth/AA3Q2g2QNDJ1rtfj4JHYlQAuQZHkyOGdks5qpKMTgaJpZM4J5saS
.

@gaoyangxiaozhu
Copy link
Author

哦哦 好尴尬... @hax

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants