作用域和预解释的加强;

 

<script>
/*变量分为基本数据类型和引用数据类型;基本包括:string、number、boolean、undefined、null;引用数据类型包括Object和function;
//推荐:JavaScript高级程序设计第三版;除了type还有defer标签。
* */
//=:赋值;按照等号分成左右两部分;右边是值;如果是一个表达式,先执行对应的表达式,把表达式返回的结果(看return)给我们的左边;看一个函数的返回值,只需要看return后面是什么就可以了。如果没有return或者return是个空,则是undefined;

//基本数据类型储存的是值;引用数据类型储存的是内存地址;
/*腾讯的面试题:
var num1=12;
var num2=num1;
num2++;
console.log(num1);//12
var obj1={
name:"朱"
};
var obj2=obj1;
obj2.name="安";
obj2["age"]=16;
console.log(obj1);//和obj2一样了;是一个,他们共用一个堆内存;
*/

//浏览器开始加载我们的HTML页面的时候,会默认开辟一个供JS代码执行的环境;我们把这个环境称之为“栈内存”;在前端开发中,我们把这个内存称之为作用域;开始浏览器默认提供的这个是全局作用域;
//在代码从上到下执行之前,首先把当前作用域下的所有带var和function关键字的,进行提前的声明或声明+定义;我们把这种机制叫预解释,有的也叫变量提升;(机制目前知道两个,预解释和闭包)
//声明(declaer);例如var num 这个就是num声明;目前只是声明,并没有赋值;所以默认值是undefined;
//定义(defined);例如num=12;这个赋值操作就是定义;(var num=12;是由两步组成的,声明+定义;)
//带var关键字的和function是不一样的;
//var:在预解释的时候,只是声明,不定义;
//function:声明加定义在预解释的时候都完成了;
//预解释完成,代码从上到下执行;



//栈内存2个作用:
// 1是提供一个供代码执行的环境(作用域);2、存储我们的基本数据类型值;
//堆内存:就是用来存储我们引用数据类型内容的;

//预解释是发生在当前作用域下的,开始支队全局下的var和function预解释;例如开始只预解释var num;function fn;函数中的var不进行预解释;

//在全局作用域下预解释的变量和函数称之为全局变量,而且也相当于给window增加了一个属性名,例如window.num=2;

//在JS产生站内存的,只有全局和函数;js中只有window和function会产生作用域;判断(if)和for中的var是全局变量;;if(){}和for(var a=0;){}这些是进行预解释的,而且是全局的变量;


//、在全局作用域下带var和不带var的区别;
// 带的能够预解释,不带的不进行 预解释;;
/*
console.log(num);
num=2;//相当于window.num=2;
console.log(num);
//结果是:num is not de defined,如果不进行报错处理,下面就不执行了。
* */
//掌握下面的。
/*:获取n-m之间的随机整数用什么公式?*/
/*:任意值求和*/
/*:数组去重*/

function distinct(ary){
var obj={};//做一个临时储存用的变量;
for (var i=0;i<ary.length;i++){
var cur=ary[i];
if(obj[cur]==cur){
ary.splice(i,1);
i--;
continue;
}
obj[cur]=cur;
}
obj=null;//清空临时储存的变;我们在不用obj的时候,让obj=null;让之前开辟的那个堆内存就没有变量占用了,浏览器空闲的时候,会自动销毁这个堆内存;(属于浏览器自带的垃圾回收机制;JS优化性能之一;不用的时候,给null下)
return ary;
}
var ary=[1,2,3,0,0,3,1,1,2,3,3,4,4,5,6,6,7];
var newAyy=distinct(ary);//把全局下的ary变量的值传给我们的函数;
console.log(newAyy);
//带function关键字的,预解释的时候就完成了声明和定义的过程(开辟一个新的堆内存,把函数中的代码当做字符串存储到我们的堆内存中;)
//因为在预解释的时候,函数声明和定义完成了,当代码执行再遇到的时候,浏览器比较懒,直接跳过就可以了;
// 函数执行,会形状一个私有的作用域;来保护里面的私有变量不受外界的干扰,我们把函数的这种保护机制叫闭包;
// 预解释之前,有一个重要的,就是给我们的形参赋值;
// 1、私有作用域中也会进行预解释,在私有作用域中声明的变量是私有变量(局部变量),在私有作用域中定义的形参,也是私有变量;
// 2、私有作用图下的代码执行;
// 3、位了节省性能,当前形参的这个私有的作用域就销毁了;
</script>