- 存储(变量)
Js中变量是存在栈内存中
Js中的内存分两种 栈内存 堆内存
栈内存 就是存放变量的
堆内存 就是存代码块 object 和function
Js特殊在它是一个弱类型语言:
定义变量的时候没有明确指明它的数据类型,而是有后面赋的值决定它的类型
Var a=”” var a=12; var a=[];var a={}
Java是强类型语言
定义变量的时候就指明它的数据类型,后面的赋值就不能随便赋值了,必须和数据类型保持一致。
String a=”123”; number a=12; Boolean a=true;
Js内存存放机制
- 基本数据类型:string number Boolean undefined null
如果变量后面的值是基本数据,就直接存在栈内存中。栈里面要求变量不能重名,如果重名后者就会覆盖前者。
- 引用数据类型:object array function
如果变量后面是引用数据类型,将后面的代码块存在堆内存中,然后将堆内存中的内存地址赋值给前面的变量。
备注:
浏览器在执行js代码前,找出所有的关键字var 和function 将定义的变量存在内存中,存放完毕之后按照自上向下的顺序一步一步执行,当使用某个变量的时候(console.log(xxx)),就会向内存查找,有就直接使用,没有就xxx is not defined,如果是赋值,就相当于给window添加了一个属性且赋值。a=45;
作用域
1.浏览器在执行js代码的时候,会给js代码分配一个全局对象叫window,对应的这个全局空间就叫全局作用域。
2.私有作用域
函数再执行的时候,会开辟一个私有空间,叫私有作用域。在私有空间下,分配一个内存模块和一个执行模块。内存模块先找出所有的var和function 把变量存进去,执行模块由上到下逐行执行,再操作变量的时候,先向自己的私有作用域下查找是否有这个变量,有就看赋值了没有,赋值了就直接使用,没赋值就是undefined。如果没有这个变量,就向该私有作用域的父级作用域查找,有就使用(看赋值了没有,赋值了就直接使用,没有就是undefined),如果没有就向父级的父级查找,以此类推直到window,如果window下没有就报错 xxx is not defined。如果有看赋值了没有,赋值了直接使用,没赋值就是undefined。
这种查找机制就叫作用域链。
变量提升
作用域链查找过程中,看一个变量是否在该作用域下存在,存在看赋值了没有,赋值了直接使用,没有赋值就是undefined。这种功能就是变量提升。
函数归属问题
函数归属于哪一个作用域,跟它在哪个作用域下定义有关,跟它在哪个作用域下执行无关。
函数参数问题
Function fn(a);定义函数,如果函数带形参,就相对于在内存中存储了一个变量a。
函数调用时:先开辟一个私有空间,先把形参存到内存中,如果带实参,给这个变量赋值,如果没带就是undefined,然后再找出代码块中的所有var和function,然后代码从上到下一次执行。
形参带默认值,先把形参和值一起存到内存中,带实参调用,就相当于把值进行覆盖。
备注 window不是js所有的,而是浏览器的一个对象。
= 赋值运算(从右往左) 就相当于给变量存东西 var a=2;var b=[12,56]
== 才是真正的等号
=== 恒等于 即判断数据类型,还判断值 a=3;b=”3” a===b;
Var fn=function(){}和function fn()定义函数是不一样的。
- 销毁内存
浏览器没经一段时间,自动去检测js中没有用的内存,把它销毁掉。
Js中的认为销毁变量 给这个变量赋值为null a=null;null的本质是空指针
内存销毁的顺序是:先存后销。
-------------------------
什么叫内存泄漏?
没有用到的内存,没有及时释放,叫内存泄漏。
典型泄漏的例子
- for循环
- 函数返回的是一个引用数据类型 代表就是闭包
内存释放?
就是内存销毁。让栈和堆之间的指向断开就叫内存销毁。
函数调用:
每个函数都有一个返回值,如果人为return了,返回的是什么就是什么,没有return默认是undefined。
Var 和function
- 都是定义变量。
- Var再内存中是只声明没定义。Function再内存中是即声明又定义了。
Var只声明了没定义,所以不能再没有定义前就使用否则是undefined,function是既定义又声明了,所以调用函数和定义函数顺序没关系。
Var fn=function 和function fn
前者是只声明了但没定义,后者是即声明了也定义了。
For
1.求1到100之间的质数?质数:只能被1和本身整除的数是质数,最少质数是2.
for(var i=1;i<=100;i++){
// 逻辑 拿i除以2...i
for(var j=2;j<=i;j++){
if(i%j==0&&j!=i){
// 这个条件是除尽了就break
break;
}else if(i==j){
// 重复太多保留最后一个
// 都除不尽说名是质数
document.write(i+",")
}
}
}