js基础

91 阅读4分钟

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指向