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

2018-10-11  本文已影响0人  sxfshdf

全局变量不能用

<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,函数才可以
上一篇下一篇

猜你喜欢

热点阅读