JavaScript中hoisting(悬置/置顶解析/预解析) 实例解释,全局对象,隐含的全局概念

JavaScript中hoisting(悬置/置顶解析/预解析) 实例解释,全局对象,隐含的全局概念

<html>
 <body>
  <script type="text/javascript">
    //JavaScript中hoisting(悬置/置顶解析/预解析) 实例解释
    myname = "global"; // global variable
    function func() {
        //var myname; // 等同于 -> var myname = undefined;
        //alert(myname); // "undefined"
        //myname = "local";
        //alert(myname); // "local"

        //JavaScript中,你可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行为称为 hoisting(悬置/置顶解析/预解析)。
        //只要你的变量是在同一个作用域中(同一函数),它都被当做是声明的,即使是它在var声明前使用的时候。
        //当你使用了一个变量,在函数中又重新声明的话,就可能产生逻辑错误(可能不是预期使用全局变量,而是变成局部变量 undefined)
        //所有的变量声明当被悬置到函数的顶部了,myname被当做了函数的局部变量(尽管是之后声明的)
        alert(myname); // "undefined"
        var myname = "local";//如果这个前面不加var 则上面的myname使用全局变量弹出global
        alert(myname); // "local"

        from_func_global = "test";
    }

    func();

    var my_var = "myvar";
    //每个JavaScript环境有一个全局对象,当你在任意的函数外面使用this的时候可以访问到。你创建的每一个全部变量都成了这个全局对象的属 性。
    //在浏览器中,方便起见,该全局对象有个附加属性叫做window,此window(通常)指向该全局对象本身。
    //JavaScript有隐含的全局概念,意味着你不声明的任何变量都会成为一个全局对象属性
    //通过var创建的全局变量(任何函数之外的程序中创建)是不能被删除的。
    //无var创建的 隐式全局变量(无视是否在函数中创建)是能被删除的。
    //隐式全局变量并不是真正的全局变量,但它们是全局对象的属性。属性是可以通过delete 操作符删除的,而变量是不能删除的
    // 试图删除
    alert(delete my_var); // false
    alert(delete myname); // true
    alert(delete from_func_global); // true
    // 测试该删除
    alert(typeof my_var); // "string"
    alert(typeof myname); // "undefined"
    alert(typeof from_func_global); // "undefined"

  </script>
 </body>
</html>
原文地址:https://www.cnblogs.com/zdz8207/p/javascript-hoisting-global.html