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,想用数组方式传参就用apply
function 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被赋值为这个空对象
- 执行构造函数内部代码,为空对象添加属性