1.注意项
使用函数名只会访问函数指针,不会执行函数
const fun = add 与 const fun = add()
2. 箭头函数
箭头函数不能使用arguments(扩展操作符),没有prototype属性
3. 函数默认值
// 给参数传undefined时,会使用默认值function makeKing(name = 'Henry', numerals = 'VIII') {console.log(`King ${name} ${numerals}`);}makeKing(undefined, 'I') //King Henry I
4. arguments对象
// arguments对象是一个类数组对象(但不是Array实例对象),可以弥补没有函数重载的缺陷// arguments对象有length属性function add(){console.log(arguments)// 使用length属性获取长度console.log(arguments.length)}add('a','b')// {"0": "a", "1": "b"}// 2
5. this指向问题
this是函数执行的上下文,引用的是把函数当成方法调用的上下文对象
this指向问题.webp
6. apply()、call()、bind()
function sum(num1, num2) {return num1 + num2;}// apply() 改变this指向并调用函数// 接收2个参数:参数1: this对象,参数2:Array实例或arguments对象function applySum(num1, num2) {return sum.apply(this, [num1,num2]); // 或者直接传入 arguments 对象// return sum.apply(this, arguments);}// call()作用与apply()一样// 接收多个参数:参数1: this对象,后面参数:调用函数需要的参数// 用哪个? 想一个个传参就用call,想用数组方式传参就用applyfunction callSum(num1, num2) {return sum.call(this, num1, num2);}// bind 只会改变this,不会调用函数function sayColor() {console.log(this.color);}const obj = {color: 'red'}const bindSum = sayColor.bind(obj)bindSum() // red
7. 函数声明与函数表达式
// 函数声明有提升,函数表达式没有提升,类似于let与var的暂时死区// 函数声明function sum() { }// 函数表达式let sum = function(){ }
8. 立即调用函数
(function() {// 块级作用域})();
9. 构造函数
使用new操作符调用构造函数,不使用调用普通函数
对象的创建过程
- 在内存中创建一个空对象
 - 这个空对象内部的[[Prototypete]]被赋值为构造函数的prototype属性
 - 构造函数内部this被赋值为这个空对象
 - 执行构造函数内部代码,为空对象添加属性
 
