欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-25 07:56:26
...

全局变量不能用

<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,函数才可以