美文网首页
全局变量不可用和立即执行函数

全局变量不可用和立即执行函数

作者: sxfshdf | 来源:发表于2018-10-11 23:05 被阅读0次

    全局变量不能用

    <body>
      <div id="parent"></div>
      <div id="x"></div>
      <script>
        console.log(parent) // Window
        console.log(x) // <div id="x"></div>
      </script>
    </body>
    

    上面代码中分别打出 parent 和 x ,发现 parent 打出Window ,因为 parent 被全局变量parent 所覆盖。parent 为 window 默认的拥有的属性。

    <body>
      <div id="parent"></div>
      <div id="x"></div>
      <script>
        var parent = document.querySelector('#x')
        console.log(parent) // <div id="x"></div>
        console.log(window.parent) // <div id="x"></div>
      </script>
    </body>
    

    发现使用全局变量var 声明,使得全局属性window.parent被覆盖了,输出结果只有 <div id="x"></div> 。
    同理,其他全局变量名字如 alert ,self 等也有这样的情况。

    使用局部变量,发现全局变量和局部变量不会相互覆盖。

    <body>
      <div id="parent"></div>
      <div id="x"></div>
      <script>
        function x(){
          var parent = document.querySelector('#x')
          console.log(parent) 
        }
        x.call() // <div id="x"></div>
        console.log(window.parent) // Window
      </script>
    </body>
    

    所以,最好不要用全局变量,可以使用局部变量。
    上面的代码涉及到一个概念:立即执行函数

    立即执行函数

    即为了使用一个函数以内的局部变量,声明函数后立即调用它。
    函数可以是匿名函数,然后立即调用,所以代码可以简化为以下:

        function(){
          var parent = document.querySelector('#x')
          console.log(parent)
        }.call()
    

    **但是声明一个匿名函数,然后立即调用会浏览器认为语法错误而报错。解决方法有以下几种

    1. 把函数和函数调用用括号括起来
        (function(){
          var parent = document.querySelector('#x')
          console.log(parent)
        }.call())
    
    1. 把函数用括号括起来
        (function(){
          var parent = document.querySelector('#x')
          console.log(parent)
        }).call()
    
    1. 在匿名函数开头添加标记
    -function(){
          var parent = document.querySelector('#x')
          console.log(parent)
        }.call()
    
    +function(){
          var parent = document.querySelector('#x')
          console.log(parent)
        }.call()
    
    ~function(){
          var parent = document.querySelector('#x')
          console.log(parent)
        }.call()
    
    !function(){
          var parent = document.querySelector('#x')
          console.log(parent)
        }.call()
    

    block(代码块)和 let

    {
          var parent = document.querySelector('#x')
          console.log(parent)
    }
    // <div id="x"></div>
    console.log(window.parent) // <div id="x"></div>
    

    此处不能使用var , 使用后会覆盖全局变量,要使用 let,主要是因为关键字 var 进行声明导致变量提升。

    {
          let parent = document.querySelector('#x')
          console.log(parent)
    }
    // <div id="x"></div>
    console.log(parent) // Window
    
    {
          var parent = document.querySelector('#x')
          console.log(parent)
    }
    console.log(parent)
    // 相当于
    var parent
    {
          parent = document.querySelector('#x')
          console.log(parent)
    }
     //<div id="x"></div>
    console.log(parent) // <div id="x"></div>
    // 所以实际上还是在声明一个全局变量。代码块包不住 var,函数才可以
    

    相关文章

      网友评论

          本文标题:全局变量不可用和立即执行函数

          本文链接:https://www.haomeiwen.com/subject/wgmiaftx.html