这里写自定义目录标题
js高级
1. 数据、变量和内存
-
基本概念
每个变量都对应一块内存,变量名用来查找对应的内存,变量值是内存中保存的数据内存分类:栈,堆;**栈:**保存局部变量/全局变量 堆:保存对象 对象名在栈中数据特点:可传递;可运算; 内存中所有的操作都是针对数据;
-
数据,变量和内存的关系
内存是用来存储数据的空间,不是永久;代码存储在硬盘,加载到内存空间运行,
-
引用对象
两个引用对象指向同一个对象,一个引用对象改变了内部数据,其他变量指向的数据也会改变
两个引用对象指向同一个对象,为其中一个对象重新赋值,另一个对象指向不变
var a = {name: 'miao'} function fn(obj){//这样只是把a的值赋给obj,也就是obj指向a存储对象的地址 obj = {name: 'yawen'}//这样obj指向了另一个对象的地址,但a的指向不变 }; fn(a); console.log(a.name);//这里打印出 miao
-
JS调用函数时传递对象,是值传递还是地址传递
当变量指向数据时,引用函数传递的是数据;当变量指向对象时,引用函数传递的是对象地址(也是变量的值);或者可以理解为值传递和引用传递
-
js如何管理内存
1)内存生命周期。分配内存空间得到使用权,存储数据并反复重复操作,对象释放空间
obj=null
,成为垃圾对象后由垃圾回收器回收;局部变量释放空间,函数开始执行时分配空间,执行结束后释放空间。垃圾对象是指没有引用的不可达对象,会被垃圾回收器回收
2. 对象
对象可以封装多个数据,包括属性和方法,方法是一种特别的属性。
var a = {
name:'Tom',
setname: function(name){
this.name = name;
}
}
//调用方法一
a.setname('Alice')//调用对象内的方法
a.name = 'Alice'//调用对象内的属性值
//调用方法二
a['setname']('Alice')
a['name'] = 'Alice'
只能用方法二:当属性名称中有特殊字符(’-’,’ ')时;变量名不确定时
var name = "Bob"
var age = "18"
var p = {}
p[name] = age //当属性名或者属性值存储在变量中的时候,只能使用方法二
3. 函数
-
函数执行方法
test(); //直接执行 obj.test(); //变量调用 new test(); //new方法 test.call/apply(obj)//临时将test方法成为obj的方法进行调用
-
回调函数
定义后不是直接被调用的函数。
常见的回调函数:DOM事件回调函数;定时器回调函数;ajax请求;生命周期回调函数
4. IIFE
IIFE(immediately-Invoked Function Expression) 立即调用函数表达式,匿名函数。这种方式可以隐藏实现,且内部变量不会污染全局空间。windows. ( ) 会 定 义 一 个 名 为 ()会定义一个名为 ()会定义一个名为的函数,函数调用后返回一个对象。