javascript作用域问题踩坑

566 阅读1分钟

今天在群里看到大家讨论两段代码,本来以为没什么大不了,简单的作用域问题而已,结果一执行,发现简直颠覆了自己的认知。 先献上代码,请仔细看:

  • 代码片段1:

    {
    function a(){};
    a = 10;
    }
    console.log(a)
    //执行结果:ƒ a(){}
    
  • 代码片段2:

    {
      a = 10;
      function a(){};
      }
    console.log(a)
    //执行结果:10
    
  • 代码片段2:

    {
      var a = 10;
      function a(){};
      }
    console.log(a)
    //执行结果:变量重复报错!
    

是不是觉得很神奇? 这里有个很关键的点:

  1. 块级作用域里面,不能 var 和 function 同时声明一个变量会报错。
  2. 块级作用域里面声明了一个函数,global 里面也会声明一个同样的,有两份。这里要注意不是绝对会在global里面,需要看当前的静态位置,是在这个花括号外的一层作用域里。
  3. 如果一个window上的变量已经被定义了,那么再定义函数就会失效。 看代码:
  {
  function a(){};
  a = 10;
  window.a = 10//把全局的a也给改了
  }
  console.log(a)
  //执行结果:10

可能不在global的演示:

  function foo() {
        var a = 1
        let b = 2
        {
            let b = 3
            var c = 4
            let d = 5
            function dd(){}
            dd = 666
            // debugger
            console.log(dd)
        }
        console.log(dd)//我的另一份在这里
        
    }
    foo()