天天看点

js 预解释

<!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>
    <!-- 一、js数据类型:
           1 基本数据类型:number string boolean null undefined 按值操作 
           2 引用数据类型:Object{} 数组[] /^.*$/g正则 Date function 按地址操作 
         python数据类型:
           1 不可变数据类型 :Number String Tuple
           2 可变数据类型:List Set Dict
          java 数据类型:
           1 基本数据类型:Byte Character Short Integer Long Float Double Boolean
           2 引用数据类型:String Array List Map Set  Enum Class 
           window是全局作用域对象
          二、预解释(变量提声浏览器的一种机制):在当前的作用域中,js代码执行之前,浏览器首先会默认的把所有的带Var和function的进行提前的声明或定义
            声明(declare): var num; 声明 只声明没有定义默认值为undefined
            定义(defined): num=12;定义
            对于带var和functionu关键字的在预解释的时候操作是不一样的
            var--在预解释的时候只是提前的声明
            function--在预解释的时候只是提前的声明+定义
            预解释只发生在当前作用域,开始只对全局window下var function预解释,当function执行时才对function中的进行预解释
          三、js内存的分类:
            栈内存:用来提供一个供js代码执行的环境(全局和私有作用域)
            堆内存:用来存储引用数据类型的值:对象存储的是属性名和值 function存储的是方法代码块字符串
          四、方法的执行
            1、若有形参,先给形参赋值
            2、对方法当前作用域进行预解释
            3、方法作用域的代码从上到下执行
          五、全局变量和私有变量
            1、在window全局作用域下声明(预解释)下的变量为全局变量
            2、方法的形参和作用域(预解释下var)的变量(var 声明过)为私有变量,若没有var的变量则向上级作用域查找 
            3、在方法私有作用域,我们代码执行的时候遇到了一个变量,首先我们确定它是否为私有变量,若是,那么和外面(全局)没有任何关系,如果不是,则往当前作用域的上级作用域查找,若上级也没有一直查到window,
            若是获取值但到window也没有则会报错is not defined,若是设置值 则相当于给window增加一个属性并赋值
          六、全局if条件下语句定义的变量:
            不管if条件是否成功都会对if语句内var的变量进行预解释,也相当于全局变量
          七、若变量名和函数名一样会冲突的,不会进行重复的声明但会重新定义
    -->
    <script>
        console.log(num); //undefined
        //console.log(count); //报错 没有var无法预解释先声明 not defined 下面的代码都不执行了
        var num = 12;
        count = 10;
        console.log(num); //12
        var obj = {
            "name": "howhy",
            "age": 12
        }
        fn(); //此处fn可以执行因为预解释function已经声明+定义了
        function fn() {
            console.log("num:" + num, obj)
        }

        function add(num1, num2) {
            console.log(num); //12
            num = num1 + num2; //没有var所有不是私有变量所以往上作用域查找是全局的num
            console.log(num) //3
        }
        add(1, 2)
        console.log(num) //3
        function add1(num1, num2) {
            console.log(num); //undefined 方法作用域内var num了所以是私有变量与上级作用域没关系
            var num = num1 + num2;
            console.log(num) //3
        }
        console.log(num) //12

        add1(1, 2)

        function fun() {
            //console.log(name);//报错 is not defined
            name = "howhy";
        }
        fun()
        console.log(name) //howhy
        console.log(window.name)
        if (!("name" in window)) {
            var name1 = "aaaa";
        };
        console.log(name1) //不管if条件是否成功都会对var变量进行全局声明(预解释)
            //fun1(); //匿名函数只会预解释等号左边的变量,所以只会声明fun1不会定义 此处调用会报错fun1 is not defined
        var fun1 = function() {
            console.log("rrrrr");
        };
        //以下自执行函数 不用不括号时开关可以加特殊符号+ - ~ !不会进行预解释 当代码执行到这个位置会自动执行
        (function(str) {
            console.log("1111111" + str)
        })("aaa");

        +function(str) {
            console.log('444444444444' + str)
        }("cccccaaaaaaaa")
        //函数体中的return后面的代码虽然不会执行,但会进行预解释
        function fun2(){
          console.log(age);//undefined
          return function(){

          };
          var age=22;
        }
        fun2()
        //若变量名和函数名一样会冲突的,预解释时 不会进行重复的声明但会重新定义  
        fun3();//11
        function fun3(){console.log(1);}
        fun3();//11
        var fun3=10;
        fun3();//会报错 fun3 is not function()
        function fun3(){console.log(11);}
        fun3();
    </script>
</body>

</html>      

继续阅读