<!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>