经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
[面试题] 函数默认参数作用域
来源:cnblogs  作者:CodeSpirit  时间:2021/12/15 9:03:00  对本文有异议

今天看到了一道很有意思的面试题,在听完老师的讲解后,我决定也和大家讲讲这道题

  1. var x = 0
  2. function foo(x, y = function() { x = 3; console.log(x) }) {
  3. console.log(x)
  4. var x = 2
  5. y()
  6. console.log(x)
  7. }
  8. foo()
  9. console.log(x)

大家可以想想这道题的答案是什么?

??????好 时间到

接下来我来讲讲这道题

要想做对这道题 我们得先知道一个概念

函数中的参数如果有默认值的情况下,那么他是会形成一个参数作用域的

或许有小伙伴会不相信,为啥你说会形成作用域就形成作用域呢?

那么 我们来看下官方ecma给出的解释是什么?

函数默认值作用域

小伙伴们,可以仔细读一读这一段话.我简单翻译一下

如果函数的形参不包含任何默认的值,那么函数作用域将会与参数共享一个作用域

如果默认参数存在的话,那么会形成一个参数作用域

好滴 我们现在分析下

  1. var x = 0;
  2. //函数有默认值的时候 会形成一个参数作用域
  3. function foo(x, y = function () { x = 3; console.log(x) }) {
  4. //第一个输出的时候 会先去寻找函数内部作用域有没有x的声明
  5. //小伙伴可能会有疑惑,这个var申明的不是会有变量提升嘛?
  6. //我来解释一下 如果有默认值的话 x会先去参数作用域寻找
  7. //显然 在这个之前是没有声明的 所以会去函数寻找默认值形成的参数作用域
  8. //这时候 x的值是 undefined
  9. console.log(x);
  10. var x = 2;
  11. //执行y 这时候的y函数内的值是去寻找参数作用域内的x
  12. //给参数作用域内的x 赋值为3 所以输出为3
  13. y();
  14. //最后这个输出x 在函数内的作用域寻找
  15. //找到了var x=2 这个声明
  16. //所以输出2
  17. console.log(x);
  18. }
  19. foo();
  20. // 这个输出x是去寻找全局的x
  21. //这时候的全局x=0 输出为0
  22. console.log(x);

好 我们现在已经分析完了 大家可以仔细看看

总体而言还是比较简单的

本文来自博客园,作者:CodeSpirit,转载请注明原文链接:https://www.cnblogs.com/codespirit-zx/p/15670216.html

原文链接:http://www.cnblogs.com/codespirit-zx/p/15670216.html

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号