一. 函数this的三种指向
首先来理解一下环境对象this:谁'调用'我(this),我(this)就指向谁。 小技巧: 没点没new是window, 有new是实例,有点是点左边的对象
1.普通函数
函数名() :this指向window
function fn() {
console.log(this)
}
fn()//this指向window
2.对象方法
对象名.方法名() : this指向点前面的对象
let obj = {
name:'张三',
learn: function(){
console.log(this)
}
obj.eat() // this指向obj
3.构造函数
new 函数名() : this指向new创建实例对象
function createPerson(name,age,sex){
//this的四个作用:
//(1)创建一个空对象
//(2)this指向这个对象
//(3)给对象赋值
//(4)返回这个对象
this.name=name
this.age=age
this.sex=sex
}
let p1=new createPerson('张三',18,'男')
console.log(p1);//createPerson实例对象
二.函数上下文调用
修改函数内部的this
- 函数名.call(修改后的this,形参1,形参2…………)
- 函数名.apply(修改后的this, 数组或伪数组
- 函数名.bind(修改后的this) bind注意点:
- 不会立即执行函数,而是得到一个修改this之后的新函数
- bind一般用于修改: 定时器函数、事件处理函数
all 和 apply 和 bind 三者区别
相同点 :
作用一致,修改函数this指向
不同点 :
- 传参方式不同 : call是按照顺序传参, apply是数组/伪数组传参
- 执行机制不同 : call和apply会立即执行函数,而bind不会立即执行而是得到修改this的新函数
三. 闭包
- 闭包closure:是一种函数和上下文引用的组合,也可以说是一个访问其他函数内部变量的函数
- 闭包作用 : 解决变量污染
代码演示如下:
四. 递归
- 递归函数: 一个函数在内部调用自己
- 递归作用和循环类似的,也需要有结束条件
- 递归应用:浅拷贝与深拷贝 浅拷贝与深拷贝:
- 浅拷贝:拷贝的是地址,修改拷贝的数据会影响原来的数据
- 深拷贝 :拷贝的是数据,修改拷贝的数据不会影响原来的数据 注意点: 浅拷贝与深拷贝有两种方式 方式一(推荐使用) : JSON方式实现
- let newObj = JSON.parse( JSON.stringify( obj ) )
方式二 : 使用递归思路,遍历dom树,处理起来比较麻烦,难以理解
下面的代码就是用递归的方式演示
let obj = {
name: '张三',
age: 20,
sex: '男',
hobby: ['吃饭', '睡觉', '学习'],
student: {
name: "班长",
score: 90
}
}
function copy(obj, newObj) {
for (let key in obj) {
if (obj[key] instanceof Array) {
newObj[key] = []
copy(obj[key], newObj[key])
} else if (obj[key] instanceof Object) {
newObj[key] = {}
copy(obj[key], newObj[key])
} else {
newObj[key] = obj[key]
}
}
}
let newObj = {}
copy(obj, newObj)
newObj.name = '李四'
newObj.hobby[0] = '游戏'
newObj.student.score = 100
console.log(obj, newObj);
以上就是我对函数的几个经典面试题理解。