JS 引用数据类型函数问题
1.JS中只要是引用数据类型都可以增加属性
函数的name属性
2.JS函数的name属性一般就是函数的名称 function fn()-------->fn.name="fn"
3.匿名函数的name属性为空字符串
4.通过构造函数方式创建一个函数 new Function("res","return res").name="anonymous"不管有没有起名字都是这个
5.通过以下方式得到的为"bound f1"; function f1(){}; var f2=f1.bind(null); f2.name="bound f1";
关于函数的length
1.函数的length表示的是形参的长度,形参的默认值会影响length,如果形参的第一个参数有默认值,则length为0,如果形参的第一个参数没有默认值,第二个参数有默认值,则length为1
2.函数形参的默认值只有给这个形参设置undefined的时候才会触发
变量提升
1.在作用域形成之后代码执行之前,将所有带var和function关键字的变量提前的声明或定义
2.全局作用域:打开浏览器就形成,代码执行空间或者环境,最大为window
3.私有作用域:一个函数执行就会形成一个私有作用域
4.块作用域:ES6新增,用{}表示
5.带var关键字只是提前声明
6.带function关键字会既声明又定义
7.let没有变量提升,必须先声明再使用,同样变量不能重复声明,定义的变量不会给window增加属性
8.const没有变量提升,定义常量,必须先声明再使用,必须赋值,并且定义后不能修改
变量重名
1.ES5中变量和函数名重名会怎么样? 会出现重复声明的情况,也就是在声明时会出现覆盖的情况,由于ES5中会出现变量提升情况,所以会出现错误
变量提升的特殊问题
1.自执行函数没有变量提升
2.等号右边没有变量提升
3.不管条件是否成立,都会进行变量提升,但是var和function都是声明不定义,当条件成了第一步先给函数赋值 console.log(a);//undefined console.log(fn);//undefined if(true){ console.log(a);//undefined console.log(fn);//fn var a=1; function fn(){} }
私有作用域
1.一个函数执行就会形成私有作用域,一个函数可以执行多次,每次执行都会形成私有作用域,每个作用域都没有关系
2.闭包:一个私有作用域保护里面的私有变量不受外界的干扰
3.私有变量: 1)在私有作用域下声明过的变量,在函数中使用var function let const这些关键字声明的变量 2)形参
4.函数执行过程 1)函数执行形成私有作用域 2)变量提升 3)给形参赋值 4)代码执行
5.作用域链: 在私有作用域中遇到变量,先看是不是自己的私有变量,如果是就使用私有变量,如果不是则往上一级找,一直找到全局作用域为值,如果在全局作用域中没有找到,则报错
上级作用域
1.当前作用域的地址在那个作用域下定义的,那么上一级作用域就是谁
块级作用域
1.针对let const就相当于私有作用域,里面声明的变量外界是无法获取的
内存销毁
1.堆内存:存储引用数据类型
2.栈内存:作用域
3.当一个地址不再被变量占用时,浏览器会在空闲时将其销毁,这就是堆内存释放
4.栈内存的释放 全局作用域:当关闭浏览器的时候全局作用域销毁 私有作用域: 不销毁:当一个私有作用域返回一个地址被外界占用,此时这个作用域就不销毁。 销毁:一个作用域没有被外界占用,就会被浏览器销毁
5.内存泄漏: 一旦有不销毁的作用域存在据有可能会造成内存泄漏,原因是不销毁的作用域
6.不销毁作用域的一个作用是用来存在外界的一个变量,使得在自执行函数中,将外界的变量变成当前作用的私有变量 var a=10; var f=(function(a){ return function(){ console.log(a++); } })(a); f();
7.for循环绑定事件问题解决索引值方案 1是使用自定义属性目的是为了存储循环数组的索引值 2使用不销毁的作用域来存储索引值
this
1.this:执行主体,this是一个对象,不是变量,所以说this是不可以赋值的
2.全局下,this指的就是window
3.this是谁,要看函数执行的时候前面有没有点,有点,那么点前面是谁,this就是谁,没有点,this就是window
4.给元素绑定事件时,给谁绑的事件,this就是谁
5.自执行函数中的this是window
6.当一个函数当作回调函数时,里面的this是window,但是可以修改this指向