接上篇:[ES6]Day08—Object对象的拓展
9.1 函数的定义和调用
9.1.1 函数的定义方式
1、自定义函数(命名函数)
即利用关键字声明函数
2、函数表达式(匿名函数)
即利用声明函数
3、new Function( ) 构造函数
语法:
- Function里面参数都必须是字符串格式
- 执行效率低,不方便书写,比较少使用
- 所有函数都是Function 的实例对象
- 函数也属于对象,JS里万物皆对象
9.1.2 函数的调用方式
1、普通函数
2、对象内的函数
3、构造函数
4、绑定事件函数
5、定时器函数
6、立即执行函数
9.2 this
9.2.1 函数内的this指向
函数内的指向,是当我们调用函数时确定的,调用方式的不同决定了 的指向不同,一般指向我们的调用者
9.2.2 改变函数内部this指向
、、 三种函数可以改变 指向
1、call()
语法:
作用:,并函数运行时的
例子:
2、apply()
语法:
作用: 方法调用一个参数为,给定this值的函数。
例子:
3、bind()
语法:
作用:bind()不会调用函数,但是能改变函数内部的this指向。 如果有的函数不需要立即调用,但是又想改变这个函数内部的this指向此时用
例子:
实例: 有一个按钮,当我们点击之后,禁用按钮,3秒钟后开启按钮
4、call() 、bind() 、 apply() 区别:
相同点
1、都可以改变上下文 this 指向的,第一个参数都是 this 的指向对象
2、三者的参数不限定是string类型,允许是各种类型,包括函数 、 object
不同点
1、、 会调用函数,并且改变函数内部this指向。
2、传递参数形式不同, 后面的参数全都用逗号分隔 , 后面的参数必须传一个数组
3、不会调用函数,除了返回的是以外,它的参数和一样。如果有的函数不需要立即调用,但是又想改变这个函数内部的this指向此时用方法
4、应用对象不同,、 是直接使用在函数上,而 绑定 this 后返回执行上下文被改变的函数(闭包),不会立即执行,需要才会执行。
5、主要应用场景不同,常用在继承; 经常与数组有关,比如借助于数学对象实现数组最大值最小值;不调用函数,但是还想改变this指向。比如改变定时器内部的this指向。
9.3 严格模式
9.3.1 什么是严格模式
9.3.2 开启严格模式
9.3.3 严格模式下的变化
1、变量必须先声明再使用
2、不能随意delete 已经声明好的变量
3、严格模式下全局作用域中函数的this是undefined
在正常的全局作用域中 指向
4、严格模式下,构造函数必须 new 调用
5、new 实例化的构造函数指向创建的对象实例
6、定时器 this 还是指向 window
7、事件、对象中的 this 还是指向调用者
8、严格模式下,函数中的参数不允许有重名
9、严格模式禁止不在脚本或者函数层面上的函数声明。
想了解更详细看这里 严格模式-MDN
9.4 高阶函数
什么是高阶函数?
高阶函数是对其他函数进行操作的函数,至少有这两大特征之一:
- 接收函数作为参数
- 将函数作为返回值输出
函数也是一种数据类型,同样可以作为参数,传递给另一个参数使用,最典型的就是作为回调函数。
9.5 闭包
9.5.1 变量作用域
变量根据作用域的不同分为两种:全局变量和局部变量。
- 函数内部可以使用全局变量。
- 函数外部不可以使用局部变量。
- 当函数执行完毕,本作用域内的局部变量会销毁
9.5.2 什么是闭包
是指的 函数。
简单来说,一个作用域可以访问另外一个函数内部的局部变量
的作用:延伸了变量的作用范围
例子:
解决思路:
将 函数作为 函数的返回值,用一个变量在外部接收,由于返回值为一个函数,所以调用 就可以得到 num 的值
9.5.3 闭包的应用
1、循环注册点击事件
但是闭包会产生问题,因为创建了 立即执行函数 ,应该要马上销毁变量 ,但是这里要等点击事件执行了才能销毁变量
2、循环中的setTimeout()
3、计算打车价格
// 打车起步价13(3公里内),之后每多一公里增加5块钱,用户输入公里数就可以计算打车价格
//如果有拥堵情况,总价格多收取10块拥堵费
4、思考题1
所以执行下面这段代码:
综上所述这道题 没有局部变量的访问,不存在闭包(有点坑,哈哈哈),最终答案为"The Window"。
5、思考题2
这里的 that 指向 object 这个对象,所以 that.name =“My Object” ,这道题存在一个闭包就是getNameFunc()
9.5.4 闭包的总结
1、闭包是什么?
是一个作用域可以访问另外一个函数的局部变量的
2、闭包的作用是什么?
延伸变量的作用范围
9.6 递归
9.6.1 什么是递归
如果,那么这个函数 就是 ,简单来说,就是函数内部自己调用自己。
9.6.2 递归的应用
1、求 1 * 2 * 3 … * n 阶乘
2、求斐波那契数列(兔子数列)1,1,2,3,5,8,13,21 …
用户输入一个数字n ,可以得到这个数字对应的兔子序列值
1+1=2,1+2=3,2+3=5,3+5=8,5+8=13 … 相邻两个数相加等于第三个数
第三个数=前两项之和 n=(n-1)+(n-2)
3、根据 id 找数据对象
输入商品id ,找到商品信息