bind cal1 apply区别
1.相同点:都是【函数对象】中属性,改变函数中this指向
2.不同点:(1)bind 方法 返回别被改变this 的 函数,手动执行函数(bind 的返回值)
(2)call() apply() 无返回值,自动触发函数
(3)call() apply 区别: apply 有两个参数,参二是数组: call有N个参数
3.call和apply除第一个参数以外,其他参数都是给 左边函数 传的 实参
4.语法 method.apply() method.call() method.bind()()
闭包
闭包是:函数返回值为定义的函数
闭包优点:外部函数可以访问函数体内的变量,
保证变量不会受全局变量的污染
闭包缺点:函数执行后;变量不会释放,容易导致内存泄漏
变量释放:每次执行函数时候,变量都为初始化状态
变量没释放:具有【存值】作用:可以实现累加效果
内存
内存:栈内存;和 堆内存;
- 1:只要声明一个变量;就会在【栈】中占一个内存
- 2; 基本类型的的VAR 在栈中;直接提供在变量上
- 3:引用类型的数值;数据存在堆中;同时提供给栈一个【地址】;指向堆中的数据
- 4:堆中有多个数据;就有多个【地址】
- 5: 栈中的变量;如果多个变量指向【同一个地址】,获取到的是【同一个堆内存中数据】
任何一个变量发生变化都会影响到【其它的变量。
拷贝
- 深拷贝:抄袭者;当抄袭者者数据改变时;不会改变被抄袭者中的内容同时,当被被抄袭中中数据发生改变时;也不会影响到抄袭者中数据。说明抄袭者可以自食其力
- 浅拷贝 拷贝后;抄袭者和被抄袭者相互影响
深拷贝引用类型数据
数据:定义新的数组或者对象;将被拷贝的数据;遍历;添加到新数组中
深拷贝方法封装
// 深拷贝数据组方法
function deepArr(arr) {
var arrCopy = []
for (var i = 0, len = arr.length; i < len; i++) {
arrCopy.push(arr[i])
}
return arrCopy;
}
// 深拷贝对象
function deepObject(obj) {
var objCopy = {};
for (x in obj) {
objCopy[x] = obj[x];
}
return objCopy;
}
// 深拷贝引用类型数据
function deepData(data) {
if (data.constructor.name === 'Array') { // 为数组
var arrCopy = []
for (var i = 0, len = data.length; i < len; i++) {
arrCopy.push(data[i])
}
return arrCopy;
} else { // 为对象
var objCopy = {};
for (x in data) {
objCopy[x] = data[x];
}
return objCopy;
}
}
递归
递归函数;是函数中的循环;通过反复调用【自身的方法】;来返回一个结果
优点,代码简单;更符合人的思考;不符合运算逻辑
缺点;运算量大,最先执行的程序;最后输出结果。
学习方式
1:找规律 2:找出口
递归实现深拷贝
// 方法的作用;实现多层复杂的数据类型的深拷贝
function deepCopy(data) {
if (data.constructor.name === 'Array') { // 为数组
var arrCopy = []
for (var i = 0, len = data.length; i < len; i++) {
// arr[i]
if (data[i] instanceof Object) {// arrary object null
arrCopy.push(deepCopy(data[i]))
} else { // 基本类型
arrCopy.push(data[i])
}
}
return arrCopy;
} else { // 为对象
var objCopy = {};
for (x in data) {
if(data[x] instanceof Object){
objCopy[x] = deepCopy(data[x])
}else{ // 基本类型
objCopy[x] = data[x];
}
}
return objCopy;
}
}
面向对象
PPT