函数属性与方法

  • 每个函数都有两个属性:length和prototype。
  • length 属性保存函数定义的命名参数的个数。
1
2
3
4
5
6
7
8
9
10
11
12
function sayName(name) { 
console.log(name);
}
function sum(num1, num2) {
return num1 + num2;
}
function sayHi() {
console.log("hi");
}
console.log(sayName.length); // 1
console.log(sum.length); // 2
console.log(sayHi.length); // 0
  • prototype是保存引用类型所有实例方法的地方,这意味着toString()、valueOf ()等方法实际上都保存在prototype. 上,进而由所有实例共享。
  • prototype属性是不可枚举的。
  • 函数还有两个方法: apply()和call(),这两个方法都会以指定的this值来调用函数。
    • apply()方法接收两个参数:函数内this的值和一个参数数组第二个参数可以是Array的实例,但也可以是arguments对象。
1
2
3
4
5
6
7
8
9
10
11
function sum(num1, num2) { 
return num1 + num2;
}
function callSum1(num1, num2) {
return sum.apply(this, arguments); // 传入 arguments 对象
}
function callSum2(num1, num2) {
return sum.apply(this, [num1, num2]); // 传入数组
}
console.log(callSum1(10, 10)); // 20
console.log(callSum2(10, 10)); // 20
  • call()方法与apply()的作用一样,call()向函数传参时,必须将参数一个一个地列出来
1
2
3
4
5
6
7
function sum(num1, num2) { 
return num1 + num2;
}
function callSum(num1, num2) {
return sum.call(this, num1, num2);
}
console.log(callSum(10, 10)); // 20
  • 使用call ()或apply()的好处是可以将任意对象设置为任意函数的作用域。
1
2
3
4
5
6
7
8
9
10
11
window.color = 'red'; 
let o = {
color: 'blue'
};
function sayColor() {
console.log(this.color);
}
sayColor(); // red
sayColor.call(this); // red
sayColor.call(window); // red
sayColor.call(o); // blue
  • 继承的方法toLocalestring()和tostring()始终返回函数的代码。
  • valueOf()返回函数本身。

函数表达式

  • 函数声明的关键特点是函数声明提升。
  • 定义函数有两种方式:函数声明和函数表达式
1
2
3
4
5
6
function functionName(arg0, arg1, arg2) { 
// 函数体
}
let functionName = function(arg0, arg1, arg2) {
// 函数体
};
  • 函数表达式看起来就像一个普通的变量定义和赋值,即创建一个函数再把它赋值给一个变量functionName这样创建的函数叫作匿名函数。
  • 未赋值给其他变量的匿名函数的name属性是空字符串。
  • 只要函数被当作值来使用,它就是一个函数表达式。