一、什么是函数?
函数是一段JavaScript代码,它只定义一次,但可能被执行或调用任意次。
二、函数的参数化
形参、实参、this、函数返回值
三、函数的定义
函数声明语法:
这种方法声明的函数有变量提升
function add(num1, num2) {
return num1 + num2;
}
函数表达式:
let sub = function (num1, num2) {
return num1 - num2;
};
箭头函数:
let mul = (mun1, num2) => {
return num1 * num2;
};
//当函数内语句只有一句且是return开头时 可以省略{}
let mul = (mun1, num2) => num1 * num2;
//当函数有且只有一个形参时 可以省略()
let f2 = x => x ** 2;
箭头函数可以作为立即执行函数来使用:
//4为传入的参数
let xx = ((x) => x ** x)(4);
Function构造函数
最后一个参数始终会被当成函数体,而之前的参数都是新函数的参数。
let sum = new Function(
"num1",
"num2",
"let result=num1+num2; return result;"
);
四、函数的参数
特征:js不关注参数的类型和数量 。
原因:js将传入的参数保存在arguments对象(类数组)中 ,但函数并不关心这个对象中有什么参数。
arguments对象:
1.arguments.length属性可以访问传入的具名参数的个数。
function test(a,b,c){
console.log(arguments);
}
test(1,2,3,4,5)
test.length
//5
function test(a,b,...c){
console.log(arguments);
}
test(1,2,...[3,4,5])
test.length
//2
参数默认值:
function f2(name = "User", age = 0) {
console.log(name, age);
}
f2();
//User
f2("Tom");
//Tom
扩展参数:
使用扩展运算符… 传入实参
function test(a,b,c){
console.log(arguments);
}
let aa=[“tom”,”jack”,”rose”,”li”]
test(...aa)
//[“tom”,”jack”,”rose”,”li”]
剩余参数
使用扩展运算符… 传入形参 (可以理解为截取实参的一部分)
function sum2(name, ...scores) {
let r = scores.reduce((x, y) => x + y,
0);
console.log(`${name}总分为:${r}。`);
}
sum2("Tom", 80, 90, 100);
函数参数的常见问题:
- 箭头函数不支持arguments对象。
- 箭头函数支持剩余参数 。
- arguments对象包含了剩余参数值。剩余参数没有接收到实参值时,为空数组。
- 剩余参数必须位于参数列表的末尾。
五、函数调用
1.作为函数调用
function add(a,b){
return a+b;
}
add(1,2)
说明:
1.如果return语句没有值,则返回undefined。
2.非严格的ES5中,函数调用上下文(this的值)是全局对象。然而,在严格模式下,调用上下文则是undefined。
2.作为构造函数调用
function Car(name) {
this.name = name;
return null;
}
let car1=new Car(as)
说明:
1.构造函数通常不使用return关键字,当构造函数的函数体执行完毕时,它会显式返回该对象。
2.这种调用方式下,this指向当前新创建的对象。
3.作为方法调用
let calculator = {
oper1: 10,
oper2: 20,
add: function () {
this.result = this.oper1 + this.oper2;
},
};
calculator.add();
说明:
1.一般情况下,与普通函数的使用方式一致
2.方法是属于某个特定对象才能调用的函数。
3.这种调用方式下,this指调用该函数的对象。
4.关键字this没有作用域的限制,嵌套的函数不会从调用它的函数中继承this。
var obj = {
x: 10,
fn: function () {
console.log(this) //windows
console.log(this.x) //undefined
}
var f = obj.fn
f()
4.间接调用
使用函数对象的call( )和apply( )方法可以间接调用函数。
用法:第一个参数指定调用上下文(函数内部的this),第二个参数给函数传递参数。
let obj1 = {
x: 100,
y: 200,
concat: function () {
let r = [this.x, this.y];
for (let a of arguments) r.push(a);
return r;
},
};
let obj2 = { x: 111, y: 222 };
let r3 = obj1.concat.call(obj2, 11, 22, 33);
let r4 = obj1.concat.apply(obj2, [2, 3, 4, 5]);
//r3=
//
对比 Apply()会将参数默认进行扩展运算符运算