1.函数的定义和调用
1.1 函数的定义方式
-
自定义函数 (命名函数)
function fn(){}
-
函数表达式 (匿名函数)
var fn = function(){}
-
利用 new Function(‘参数1’,‘参数2’,‘函数体’);
-
比较麻烦,用的比较少
-
所有函数都是 Function 的实例(对象)
-
函数也属于对象
-
1.2 函数的调用方式
-
普通函数
function fn() { console.log('人生的巅峰'); } fn();
-
对象的方法
var o = { sayHi: function() { console.log('人生的巅峰'); } } o.sayHi();
-
构造函数
function Star() {}; new Star();
-
绑定事件函数
btn.onclick = function() {}; // 点击了按钮就可以调用这个函数
-
定时器函数
setInterval(function() {}, 1000); //这个函数是定时器自动1秒钟调用一次
-
立即执行函数
(function() { console.log('人生的巅峰'); })();
2.this
2.1 函数内 this 的指向
调用方式 | this指向 |
---|---|
普通函数调用 | window |
构造函数调用 | 实例对象 原型对象里面的方法也指向实例对象 |
对象方法调用 | 该方法所属对象 |
事件绑定方法 | 绑定事件对象 |
定时器函数 | window |
立即执行函数 | window |
2.2 改变函数内部 this 指向
-
call()
-
会直接调用函数
-
放的是参数列表
-
可以改变函数内部的 this 指向
-
主要作用可以实现继承
-
-
apply()
-
会直接调用函数
-
可以改变函数内部的 this 指向
-
但他的参数必须是数组(伪数组)
-
apply 的主要应用:比如说我们可以利用 apply 借助于数学内置对象求最大值
var arr = [1,66,3,99,4]; var max = Math.max.apply(Math,arr); console.log(max);
-
-
bind()
- 不会直接调用原来的函数
- 可以改变原来函数内部的 this 指向
- 返回的是原函数改变this之后产生的新函数
- 应用场景:比如定时器
3.严格模式 strict mode
3.1 什么是严格模式
约束程序员按照规范代码来进行编码
3.2 开启严格模式
在js文件或者函数的第一行写上==“use strict”;==
<script>
"use strict"; //当前script标签开启了严格模式
</script>
//或者
(function (){
//在当前的这个自调用函数中有开启严格模式,当前函数之外还是普通模式
"use strict";
var num = 10;
function fn() {}
})();
3.3 严格模式中的变化
- 变量名必须先声明再使用
- 不能随意删除已经声明好的变量
- 严格模式下全局作用域中函数中的 this 指向的是undefined
- 严格模式下,如果 构造函数 不加new调用, this 会报错
- 定时器中的this指向的还是window
- 事件、对象还是指向调用者
- 严格模式下函数里面的参数不允许有重名
- 函数必须声明在最前面,不允许在if、for、while里面声明函数
更多严格模式参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_mode
4.高阶函数
高阶函数是对其他函数进行操作的函数,他接收函数作为参数 或 将函数作为返回值输出。
-
高阶函数 - 函数可以作为参数传递
-
最典型的就是作为回调函数
4.1 函数是一种数据类型
-
object复杂数据类型
-
可以当做参数来传递 —回调函数
-
可以当做返回值来返回
5.闭包
5.1 什么是闭包
一个作用域 访问到了 另一个作用域中的局部变量 就称之是闭包,这个变量所在的函数,就称之为 闭包函数。
5.2 闭包的作用
- 延伸了变量的作用范围,增强了变量的生命周期
- 缺点:导致内存泄漏 (内存泄露:本应该释放的内存空间没有得到及时释放,导致可用内存空间变小了)
6.递归
6.1 什么是递归?
- 函数内部自己调用自己,这个函数就是递归函数
- 注意:递归函数的作用和循环效果一样,由于递归很容易发生“栈溢出”错误(stack
overflow),所以必须要加退出条件return。