函数
基本概念:
一段JavaScript代码,它只定义一次,但可能被执行或调用任意次。
函数的定义会包括一个称为形参(parameter)的标识符列表,这些参数在函数体中像局部变量一样工作。
函数调用会为形参提供实参的值。函数使用实参的值来计算返回值,除了实参之外,每次调用还会有一个另一个值(本次调用的下上文),即this关键字。
函数可以嵌套在其他函数中定义,从而可以访问它们被定义时所处的作用域的任何变量。
形成闭包。
函数定义构成:
一:函数名的标识符。
函数名称是函数声明语句中必需的部分,用途就像变量的名字,新定义的函数对象会赋值给这个变量。
二:一个圆括号。由标识符组成。
三:一对花括号。由JS语句组成。
函数定义:
1.声明语法
function add(num1, num2) {
return num1 + num2;
}
2.函数表达式
let sub = function (num1, num2) {
return num1 - num2;
};
声明语法和函数表达式的区别
以函数声明的方法定义的函数,函数可以在函数声明之前调用,而函数表达式的函数只能在声明之后调用(函数声明整体会被提升到当前作用域的顶部,函数表达式也提升到顶部但是只有其变量名提升)
3.通过构造对象的形式
Function构造函数
这个构造函数接收任意多个字符串参数,最后一个参数始终会被当成函数体,而之前的参数都是新函数的参数。
let sum = new Function(
"num1",
"num2",
"let result=num1+num2; return result;"
);
//
不推荐使用这种语法来定义函数,因为这段代码会被解释两次:第一次是将它当作常规ECMAScript 代码,第二次是解释传给构造函数的字符串。这显然会影响性能。
***arguments对象***
一个类数组对象(但不是 Array 的实例),因此可以使用中括号语法访问其中的元素。
如,第一个参数是 arguments[0],第二个参数是 arguments[1]。
要确定接收到的参数个数,可以访问 arguments.length 属性。
function likes(name, fav1, fav2) {
console.log(${name}喜欢${fav1}、${fav2}。
);
let output = ${name}喜欢
;
let argCount = arguments.length;
for (let i = 1; i < argCount - 1; i++) {
output += ${arguments[i]}、
;
}
output += ${arguments[argCount - 1]}。
;
console.log(output);
}
likes(“小明”, “读书”, “篮球”);
likes(“小明”, “读书”, “篮球”, “游泳”, “骑车”);
***函数参数***
参数默认值
ES5写法:
function f1(name, age) {
name = name ? name : “User”;
age = age ? age : 0;
console.log(name, age);
}
f1();
f1(“Tom”);
ES6简化
function f2(name = “User”, age = 0) {
console.log(name, age);
}
f2();
f2(“Tom”);
常见问题:
function sum1() {
return Array.from(arguments).reduce((x, y) => x + y, 0);
}
let sum2 = () => {
return Array.from(arguments).reduce((x, y) => x + y, 0);
};
console.log(sum1(1, 2, 3), sum2(1, 2, 3));
箭头函数不支持arguments对象。
let sum3 = (…nums) => {
return nums.reduce((x, y) => x + y, 0);
};
console.log(sum3(1, 2, 3));
箭头函数支持剩余函数。
function f1(x, y, …nums) {
console.log(arguments);
console.log(nums);
}
f1(1, 2, 3, 4, 5, 6);
f1(1, 2);
arguments对象包含了剩余参数值。
剩余参数没有接收到实参值时,为空数组。
function f2(x, …nums, y) {
console.log(nums);
console.log(y);
}
f2(1, 2, 3, 4, 5);
剩余参数必须位于参数列表的末尾。