一:闭包(简单理解:拿到不该拿到的东西):
特征及作用:
1、函数嵌套函数;
2、产生影响;(两个方面影响:一方面增加内存泄露的可能,如果不将其置为null的话;另一方面是保持变量私有,相当于一个全局变量使用;由于浏览器垃圾回收机制是回收已确定不在运行得变量,而闭包是不确定的,垃圾回收机制不确定什么时候变量才完全不被用,所以变量一直存在;)
做闭包相关的面试题的思路:对每个函数都画一个 红框,确定这个框内所能拿到的变量,一步步层层推进,要注意以下变量提升等细节;
二、原型及原型链
构造函数:
构造函数和普通函数的区别是否使用了 new;
构造函数的三种返回
1、没有反回值;(不是真正的返回值)
2、简单数据类型;(不是真正的返回值)
3、对象类型;(返回new出的对象)
prototype
1、每个函数都有一个prototype的对象属性,对象内有一个constructor属性,默认指向函数本身;
2、每个对象都有一个————proto————的属性,属性指向其父类型的prototype;
//父级函数
var Car-=function(color){
this.color=color
}
//在父级的原型定义一个sail方法
Car.prototype.sail=function(){
console.log(1111)
}
//通过New实例化一个对象s,继承了父级的方法和属性以及原型上的方法和属性;(父级和子级都是函数)
var s=new Car('red')
让子函数继承父级的方法及属性
//part1
var str=function(color){
console.log(color)
}
str.prototype=Car.prototype //此方法可以将方法和属性复制过来,但是由于函数,对象,数组都是引用类型传递,一旦改变子函数的方法和属性 ,父元素也会跟着改变;
平时写继承所需注意问题及解决方法:
1、拿到原型链上的方法;
2、不能让构造函数执行两次;
3、引用的原型链不能是按值引用;
4、修正子类的constructor;
解决:
var __pro=Object.create(Car.prototype)
__pro.constructor=str
str.prototype=__pro
var m=new str('red)
三、this的指向问题
1、谁调用指谁;
2、函数内使用指window;
3、在箭头函数内,this指向邻近外层的父级;
四、小技巧
1、函数提升优先于变量;
2、构造函数的优先级大于原型链上的优先级;
五、apply、call、bind改变this指向
call(context,agr1,agr2,ag3.....) 直接传参
apply(context,[arr]) 传参由数组包着;
bind(对象) 绑定对象,改变this指向;直接传参
call,apply都是改变上下文的this指向并立即执行这个函数,bind随时执行,并且额可以在执行的时候添加;
bind改变this指向后生成一个新的函数;