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>