chapter 5
5.5 Function类型
未完待续
函数实际上是对象
,每个函数都是Function类型的实例,因此与其他引用类型一样具有属性和方法
因此函数名实际上就是函数对象的指针
,不会与某个函数绑定
//因此函数可以这么定义
// 可以用来理解 函数是对象,函数名是指针
// 但是不推荐这么定义函数
const myFun = new Function('num1', 'num2', 'return num1 + num2');
// 一个函数可以有多个名字
funtion age() {
console.log('my age is 19');
}
const myAge = age;
myAge(); // 19
age(); // 19
5.5.1 没有重载(深入理解)
- 把函数名现象做指针,可以帮助理解为何没有重载
- 重复声明两个同名函数只会覆盖前一个的引用
5.5.2 函数声明与函数表达式
解析器在向执行环境中加载数据时,会率先读取函数声明,并使其在执行任何函数代码前可用。即函数声明提升
5.5.3 作为值的函数
因为函数名本就是一个变量,所以可以将函数作为另一个函数的结合返回
要访问函数的指针而不执行函数的话
,必须去掉大括号
// sort示例
function compare() {
return function(object1, object2) {
const value1 = object1[propertyName];
const value2 = object2[propertyName];
if (value1 < value2) {
return -1;
} else if (value1 > value2) {
return 1;
} else {
return 0;
}
}
}
// 调用
const data = [
{
name: 'azoux1',
age; 19,
},
{
name: 'azoux2',
age; 190,
},
];
data.sort(compare, 'name'); // 按name排序
data.sort(compare, 'age'); // 按age排序
5.5.4函数内部属性
- 两个特殊的对象
- this
- arguments -- 保存函数参数
callee属性
-- 指向拥有这个arguments对象的函数
// 使用callee实现阶乘递归 降低耦合
function factorial(num) {
if (num < 2) {
return 1;
} else {
return num * arguments.callee(num - 1);
}
}
【松耦合】的方法,一般是底层函数,功能尽量单一,尽量避免修改底层函数。功能相近的函数,可以设计2个以上,不要为了减少代码量,把一个函数的功能设计的太多
5.5.5 函数属性的方法
每个函数包含两个属性:length和property。
其中length是希望接受的参数个数
property是保存所有的实例方法,诸如toString()等...
在es5中property的属性是不可以枚举的(for-in无效)
call()和apply()真正的用武之地不在于传递参数,而是扩充函数赖以运行的作用域
// 举个例子
window.color = 'red';
window.age = 10;
o = {
color: 'blue',
};
function showColor() {
console.log(this.color);
console.log(this.age);
}
showColor(); // red
// red 是因为当前调用showColor的是window对象
showColor.call(o) //blue
// call() 扩充了作用域 它会在o对象中寻找color属性,如果没有就是undefined
apply与call相似,只是传入其余参数的方式不同
扩充作用域的最大好处就是对象不需要和方法有任何耦合关系
bind()
bind顾名思义就是绑定,在绑定完传入的对象之后返回一个新的函数