美文网首页
JavaScript在浏览器运行时的作用域

JavaScript在浏览器运行时的作用域

作者: defphot | 来源:发表于2018-06-29 15:32 被阅读0次
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>Page Title</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
</head>

<body>

  <script>
    console.log(this); //>window...

    var a = 1;

    function test() {
      window.console.log(a); //>undefined

      var a = 2;

      window.console.log(a); //>2
    }
    test();

    //js运行环境是有一个全局命名空间
    //打开浏览器窗口,浏览器会在全局创建一个window对象,对象上绑定了浏览器属性和方法(客户端运行环境)
    //之后浏览器把我们的代码添加到window对象上(理因如此,我们实际上总是通过操作window对象控制浏览器的行为)
    //浏览器这一默认的行为 导致我们代码的顶级作用域始终是window 我们代码(我们认为的全局变量)实际上都会挂载到window对象上

    //下面语句具有等同效果:
    //var a = 1 <==> window.a = 1
    //function test() {} <==> let test = function() {} <==> window.test = function() {}

    //所以第一次console.log打印undefined的原因是:函数局部作用域没有a,会往上到上层作用域找,但是由于前面的a是定义在window下面的,上层作用域没有a,始终会找不到。

    //也可以这样理解,可以得到同样的结果。
    function topScope() {
      //相当于window
      let myWindow = {};

      //相当于 var a = 1;
      myWindow.a = 1;

      //相当于 function test() {...}
      myWindow.test = function () {
        console.log(a); //>undefined

        let a = 2;

        console.log(a); //>2
      }
      test();
    }
    topScope();
  </script>
</body>

</html>

相关文章

网友评论

      本文标题:JavaScript在浏览器运行时的作用域

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