参数作用域

总所周知,作用域有全局作用域,函数作用域和块作用域,但其实当函数存在默认参数,就会在函数实例化时产生参数作用域

面试题测试

  1. var x=1;
  2. function foo(x,y=function(){
  3. this.x=3;
  4. console.log(x);
  5. }){
  6. console.log(x);
  7. var x=2;
  8. y();
  9. console.log(x);
  10. }
  11. foo();
  12. console.log(x);
  13. /*
  14. 答案
  15. undefined
  16. 3
  17. 2
  18. 1
  19. */

本题重点在于y函数中x=3修改的是哪个x,其实答案是修改的参数x,并且参数x与函数内声明的var x=2其实是不同的x

这是由于参数作用域的产生,在函数作用域与全局作用域之间由于此处存在参数y的默认赋值,产生了参数作用域;且y函数中的x修改是其外层参数作用域的x

总结:只要存在默认参数,函数实例化时就会生成参数作用域