一、函数进阶
1.1 函数的定义和调用
采用instanceof判断前者是否属于后者。f instanceof Object. 返回true
1.2 函数的调用方式
2.this指向问题
2.1 函数内this的指向
2.2 改变函数内部this指向
2.2.1 call()
有两个作用:(1)调用函数(2)修改this指向问题。(Father.call(son)将father函数的this指向son)
则son就可以使用father的属性了
2.2.2 apply()方法
(1)可以调用函数、也可以修改this指向问题。
(2)参数传递必须是数组。
同时打印的时候,将数组去掉,变成每一个单独的元素。
(3)apply的主要应用:可以利用apply借助于数学内置对象求最大值。
因为Math.max()和Math.min()求的是数字中的最大值,而不是数组中的最大值。
此时有一个数组arr = [1,2,3,5,4,5,6].所以就可以使用apply
Math.min.apply(Math, arr),相当于调用了Math.min函数,并且this指向Math,同时,传入的参数是arr中的每一个元素,而不是一个数组。(慢慢理解,一开始有点难理解)
2.2.3 bind()方法
(1) bind不会调用原来的函数
(2)可以改变原来函数内部的this指向。返回的是原来函数改变this指向后的新函数。
(3)应用:如果有的函数不需要立即调用,但是又想改变这个函数内部的this指向,此时用bind
比如:有一个按钮,点击这个按钮后,就禁用这个按钮。3秒钟之后开启这个按钮。
修改:
有三个按钮:
2.2.4 cal、apply、bind总结
3.严格模式。
3.1什么是严格模式
(1)为脚本开启严格模式——>两种方式
(2)为某个函数开启严格模式。
3.2 严格模式的变化
允许在函数中添加函数。不能在非函数中写函数(比如在if或者for中写函数。)
4. 高阶函数
5. 闭包
5.1 变量作用域
5.2什么是闭包
闭包的本质是函数。
5.3 闭包的作用
(1)延伸了变量的使用范围。外部函数也可以使用内部变量。
但是这个闭包会造成内存泄漏,不点击,就一直不释放内存。
(2)闭包案例:
(3)闭包的题目:
(4)总结:
6.递归函数
(1)利用递归函数求斐波那契数列(兔子序列)
生兔子:第一天有一只兔子,第三天开始具有生育能力,每次生一只。f(n) = f(n-1)+f(n-2)。前一天的数量加大前天的数量(其实指新生的兔子数量,因此对当前来讲,能新生生兔子的数量等于具有生育能力的兔子,而具有生育能力的兔子等于大前天兔子的数量,因此新生的兔子和大前天兔子的数量相同)
var fn = function(n) {
if( n==1 || n == 2) {
return 1;
}
return fn(n-1)+fn(n-2);
}
console.log(fn(5));
(2)递归遍历数据
不仅可以查找各个类别,还可以查找各个类别的子类。
7. 拷贝
7.1 浅拷贝
浅拷贝:遇到对象等更深层的数据,只是拷贝的地址。
修改了拷贝后的数据,原先的数据也被修改。因为浅拷贝遇到对象等更深层的数据,只是拷贝了一个地址。
语法糖:Object.assign(target, obj); obj是要拷贝的数据。
7.2 深拷贝
要先写拷贝数组,因为数组也属于对象。