01-call 和 apply 使用场景
- 参数比较少的时候,使用call更加简洁
- 参数已经在数组或伪数组中,使用apply更合适
例,求数组最大值:
一行代码实现
var arr = [8, 68, 25, 12, 90, 72, 66, 20];
让数组arr去借用Math的max方法
var res = Math.max.apply(arr, arr);
//等价于:arr.max();
console.log(res);
02-bind方法
语法
var fn2 = fn.bind(thisArg);
作用:bind方法会去把fn函数拷贝一份,并且会返回这个副本函数,副本函数内的this指向 bind的thisArg参数
例:
var fn = function() {
console.log(1);
console.log(this);
}
var fn2 = fn.bind([10, 20, 30]);
console.log(fn2); //fn2 和 fn函数长得一样
fn2();
注意点:fn2函数调用模式虽然是函数调用模式,但是fn2函数是有bind创建的,fn2函数内的this绑定了bind的thisArg参数
call apply 和 bind 方法区别:
call apply :作用一样,写法上有点区别:
1.可以调用函数
2.可以修改this指向
3.可以给函数传递参数
bind 方法 不会去调用函数 :
1.会拷贝并返回副本函数
2.副本函数内的this指向被固定
03-bind使用练习题
var dfg = {
lover: '波哥',
saylove: function () {
// saylove 方法内的this指向dfg
setInterval(function () {
// 定时器函数内的this指向window
console.log('Dear' + this.lover + ',俺好想你,好想跟你回家!');
}.bind(this), 1000)
}
}
dfg.saylove();
04-递归函数
递归函数: 函数内部自己调用自己
注意点:递归函数需要有结束递归的条件
使用递归函数计算的套路:
1.化归思想(把复杂转简单,把未知转已知)-- 理解为是推导公式
2.啥时候结束递归
05-递归函数执行流程
递归执行流程:层层递进,层层回归
06-斐波那契数列
07-递归函数计算斐波那契的问题.html
08-解决递归函数计算斐波那契的问题.html
缓存:存储数据的容器(cache)
在js中,使用数组或对象来进行存储
使用缓存的套路:
1.定义一个数组或对象来表示缓存容器
2.计算之前先去缓存容器中查看下是否有需要的数据,如果有直接从缓存中取出来使用
3.如果没有,就需要去进行计算,还需要把计算好的结果给存储到缓存中 – 为了以后复用
09-浅克隆
思路:
- 新建一个新对象{}
- 把内容赋值遍历给新建的对象 for…in 遍历
**实现了浅拷贝:**拷贝对象的一层属性, 如果对象里面还有对象,里层的对象没有进行拷贝
**问题:**拷贝出来的对象和源对象之间没有完全独立,之间的修改会影响到对方
js中的对象 ==> 拷贝新的一份
**使用场景:**对象里面都是简单数据类型
10-深克隆
11-闭包的引用
12-闭包
闭包的概念:closure
是函数和声明该函数的词法环境的组合
函数:值得是内部函数 inner
声明该函数:外部函数 fn
词法环境:作用域链
组合:以上的综合,整体
闭包的形成条件:
至少有两个函数,而且是嵌套关系,而且内部函数还需要访问外部函数声明的变量
闭包的作用:
1.可以来保护数据的安全
2.可以持久化维持数据
13-闭包保护缓存数据安全
斐波那契使用知识点:
1. 递归函数--计算结果
2. 缓存--解决大量重复计算的问题
3. 闭包--保护缓存数据的安全性