内存&&变量&&数据
内存
内存分类
栈:全局变量/局部变量(函数名在栈空间)
堆:对象(函数本身在堆空间)
小内存的两个数据
内部储存的数据and地址值
var obj = {name:"Jack"};
var a = obj;
数据
数据的特点:可传递,可运算
内存中所有操作的目标:数据(算术运算 逻辑运算 赋值 运行函数)
变量
可变化的量,变量名和变量值组成
每个变量对应一小块内存,变量名用来查找对应的内存,变量值就是内存中对应的数据
三者之间的关系
内存是用来存储数据的空间;
变量是内存的标识
相关问题
-
赋值和内存问题:var a = xx ,a保存的是什么?
| xx是基本数据,保存的就是数据
| xx是对象,保存的是对象的地址
| xx是变量,保存的是内存内容(数据or地址)
-
引用变量和赋值问题
|多个引用变量指向同一个对象,一个变量修改对象内部数据,另外的变量访问的也是修改后的数据
//这里其实有三个引用变量指向同一个对象 obj1 obj2还有obj(形参)修改其中一个另外的也会被修改 var obj1 = {name:"Tom"} var obj2 = obj1 obj2.age = 18 console.log(obj1.age) //18 function fn(obj){ obj.name = Jack // 注意!!! obj = {name:"Jack"} 若改为此种写法 -> 则输出为Tom 因为相当于赋值了一个新的对象,obj指向了新的地址(本来是obj1的地址),函数执行完变成了垃圾数据被释放,obj1还是指向原来的对象 } fn(obj1) console.log(obj2.name) //Jack
|2个引用变量指向同一个对象,让其中一个引用变量指向另一个对象,另一个引用变量依然指向前一个变量
var a = {age:12} var b = a a = {name:'BOB',age:13} //a指向新的变量 console.log(b.age,a.name,a.age)//12 BOB 13
对象&&回调函数
对象
|多个函数的封装体,用来保存多个数据的容器
|对象可以更方便我们统一管理多个数据
回调函数
|回调函数的概念:是自己定义的 ,没有调用但执行了
|常见回调函数:ajax请求回调函数 生命周期回调函数(暂时还没理解,正在看)
|回调函数:使用callback&&callback() 传递参数时,传或者不传回调函数都可以
<button id = "btn">测试点击事件</button> <script type = text/javascript> document.getElementById('btn').onclick = function(){//dom事件回调函数 alert(this.innerHTML) } setTimeout(function(){//定时器回调函数 alert("时间到了") },2000) </script>
IIFE(匿名函数)
定义
立即调用的函数表达式,也就是说,声明函数的同时立即调用这个函数
(functionlike(){
var a=10;
console.log(a);
})();
作用
|隐藏实现,不会污染全局命名空间
| JS只有全局作用域、函数作用域,只有function才能实现作用域隔离,如果要将一段代码中的变量、函数等的定义隔离出来,只能将这段代码封装到一个函数中。虽然大部分的函数封装都是为了复用,但也有只使用一次的函数 -> 为了隔离作用域。既然只使用一次,那么就可以立即执行并且省略函数的名字 -> IIFE
(function(){
var a=1
function test(){
console.log(++a)
}
function test2(){ //被隐藏没有向外暴露,不可调用
console.log(++a)
}
window.b = function(){ //向外暴露test这个函数
return{
test:test
}
}
})()
b().test() // b是一个函数,执行后返回一个对象
//以下三种方式都会报错
text()
text2()
b().text2()
this对象
|以函数形式调用时,this指向window;
|以方法形式调用时,this就是调用方法的那个对象