全局作用域 局部作用域(函数作用域)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //作用域
        //      - 指一个变量作用的范围
        //      - js中有2中作用域   1 全局作用域  2 函数作用域(局部作用域)

        //    1 全局作用域
        //      - 直接编写在script标签中的js代码,都是全局作用域;
        //      - 全局作用域在页面打开时创建,页面关闭时销毁;
        //      - 在全局作用域中有一个全局对象window,可以直接使用,windowd代表一个浏览器窗口,由浏览器创建可以直接使用
        //      - 在全局作用域中  创建的变量都会作为window对象的属性保存
        //      - 在全局作用域中  创建的函数将会作为window对象的方法保存
        //      - 全局作用域中的全局变量在页面任意部分都可以访问到
        // console.log(window); //Window {window: Window, self: Window, document: document, name: "", location: Location, …}  输出全局对象,window对象可以直接使用
        // var a = 666; //全局作用域下创建一个变量
        // console.log(window.a); //666 变量a作为window对象的属性
        // var b = 888;
        // console.log(window.b); //888
        // console.log(window.c); //undefined
        // console.log(c); //ReferenceError: c is not defined  报错,直接全局作用域中找变量会报错

        // function fun() {
        //     var a = 123;
        // }
        // fun();
        // console.log(a); //ReferenceError: a is not defined

        //全局作用域下创建一个函数
        // function fun1() {
        //     console.log(888666);
        // }
        // fun1(); //888666
        // window.fun1(); //888666  因为fun1在全局作用域中创建的函数将作为window对象的方法保存,故可以调用window对象的方法的形式调用函数

        // window.alert(2333333); //alert函数也是window对象的方法

        // a = 132;//对a未定义变量也可以,相当于window.a = 123; 在window对象中添加了属性a
        // console.log(a); //123

        // console.log(a); //undefined  先在控制台输出a,再赋值将输出undefined
        // var a = 123;
        //48 49行代码涉及到变量提升,var关键字声明的变量  将会在代码执行之前被声明 相当于以下代码
        // var a;
        // console.log(a);
        // a = 123; //因为先声明了变量 在控制台输出的之后再做了赋值,故控制台输出为undefined

        //如果声明变量不用关键字var 则没有变量提升 故以下输出报错
        // console.log(a); //ReferenceError: a is not defined  报错
        // a = 123;


        //- 函数的声明提前
        // - 使用函数声明形式创建的函数function(){} 它会在所有代码执行之前创建,故可以在函数声明之前调用函数
        // - 使用函数表达式创建的函数不会被声明提前,所以不能在声明前调用,

        //函数声明会提前创建
        // fun(); //666 fun在函数声明之前调用函数

        // function fun() {
        //     console.log(666);
        // }

        //函数表达式不会提前创建
        // fun2(); //TypeError: fun2 is not a function
        // var fun2 = function() {
        //     console.log(888);
        // };



        //  2 函数作用域
        //    - 调用函数时 创建函数作用域,函数执行完毕后,函数作用域销毁
        //    - 每调用一次函数,就会创建一个新的函数作用域,他们之间是相互独立的  
        //    - 函数作用域中可以访问全局作用域中的变量
        //    - 在全局作用域中无法访问局部作用域中的变量
        //    - 当在函数作用域中操作一个变量时,会先在自生作用域中寻找,有则使用,无则向上级作用域中,一次循环  如果全局作用域中依然没有找到则报错
        //    - 在函数中访问全局变量可以使用window对象

        //创建一个全局变量
        var a = 666;

        function fun() {
            var a = 123; // 在函数作用域中创建变量a
            var b = 888; //在函数作用域中声明变量b
            // function fun2() {
            //     console.log(a); //自己无a 上级有123
            //     console.log(window.a); //加window可以直接访问全局变量a666
            // }
            // console.log(a); //函数局部作用域中访问全局作用域中的a(不执行91
            console.log(a); // 先在自己找 有 123(执行91
        }
        fun(); //666
        // console.log(b); //ReferenceError: b is not defined
        console.log(a);

        // 在函数作用域中也有声明提前特性
        //  使用var声明的变量,会在函数代码执行之前被声明   
        // 函数声明也会在函数代码执行之前执行
        function fun3() {
            // console.log(c); //undefined
            fun4();

            function fun4() {
                console.log('qwe');
            }
            // var c = 456;
        }
        fun3();



        // 在函数中不适用var声明的变量就是全局变量
        var d = 789;

        function fun5() {
            console.log(d);
            d = 666; //d没有使用var,则是全局变量 相当于window.d = 666;
        }
        fun5();
        console.log(d); //全局输出d 666

        var e = 321;

        function fun6(e) { //定义形参相当于在函数作用域中声明变量  相当于var e   但是实参没有赋值,故控制台为undefined
            console.log(e); //undefined
        }
        fun6();
    </script>
</body>

</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值