变量的作用域

代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        //在JavaScript中,var定义的变量实际上是有作用域的
        //1、假设在函数体中申明,则在函数体外不可以使用,如果想要使用的话,可以通过闭包实现
        function fun1() {
            var x = 1;
            x = x + 1;
        }
       // x = x + 2;//会报错,Uncaught ReferenceError : x is not defined

        //2、如果两个函数使用了相同的变量名,只要在函数内部,就不冲突
        function fun2() {
            var x = 1;
            x = x + 1;
        }

        function fun3() {
            var x = 'A';
            x = x + 1;
        }

        //3、函数内部可以访问外部函数的成员,反之则不行
        function fun4() {
            var  x = 1;

            function fun5() {
                var y = x + 1;
            }

            var z = y + 1;//会报错,Uncaught ReferenceError : y is not defined
        }

        //4、假设,内部函数变量和外部函数变量,重名
        function fun6() {
            var x = 1;

            function fun7() {
                var x = 'A';
                console.log("inner" + x);
            }
            console.log('outer' + x);
            fun7();
        }
        //假设在JavaScript中函数查找变量从自身函数开始,由“内”向“外”查找,假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数的bianl

        //5、提升变量的作用域
        function fun8() {
            var x = "x" + y;
            console.log(x);
            var y = 'y';
        }//结果:undefined
        //说明:JavaScript执行引擎,自动提升了y的声明,但是不会提升变量y的赋值,等价如下
        // function fun8() {
        //     var y;
        //
        //     var x = "x" + y;
        //     console.log(x);
        //     y = "y";
        // }
        //这个是在JavaScript建立之初就存在的特性。建议所有的变量定义都放在函数头部,便于代码维护,例如
        function fun9() {
            var x = 1,
                y = y + 1,
                z,i,a;//undefined
            //之后随意用
        }

        //6、全局函数
        x = 1;
        function f1() {
            console.log(x);
        }
        f1();
        console.log(x);
        //全局对象window
        var w = 'xxx'
        alert(w);
        alert(window.w);//默认所有的全局变量,都会自动绑定在window对象下;
        //alert()这个函数本身也是一个window变量
        //多种用法
        var old_alert = window.alert;
        //old_alert(w);发现通用弹出来了

        window.alert = function () {

        };
        //发现alert()失效了
        window.alert(123);

        //恢复
        window.alert = old_alert;
        window.alert(456);
        //JavaScript实际上只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用
        //范围内找到,就会向外查找,如果全局作用域都没有找到,报错“ReferenceError”


        //7、规范
        //由于我们所有的全局变量都会绑定到我们的window上,如果不同的js文件,使用了相同的全局变量,冲突-》如何减少冲突,以下为示例
        //唯一全局变量
        var MassimoApp = {};

        //定义全局变量
        MassimoApp.name = "Massimo";
        MassimoApp.add = function (a,b) {
            return a + b;
        }

        //8、局部作用域let
        function fff() {
            for (var i = 0 ; i < 100 ; i++){
                console.log(i);
            }
            console.log(i+1);//问题?i出了这个作用域还可以使用
        }
        //ES6  let 关键字,解决局部作用域冲突问题
        function hhh() {
            for (let i = 0 ; i < 100 ; i++){
                console.log(i);
            }
            console.log(i+1);//Uncaught ReferenceError : i is not defined
        }
        //建议使用let 去定义局部作用域的变量

        //9、常量
        //在ES6之前,用全部大写字母命名的变量就是常量,建议不要修改,如果想改也可以
        //ES6新特性  const  定义常量
        const PI = '3.14';  //只读变量
        console.log(PI);
        //PI = '234';会报错  TypeError : Assignment to constant variable
    </script>
</head>
<body>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值