揭秘JavaScript函数的调用方式与传参技巧——史上最全指南
2023-09-19 12:28:57
在JavaScript的世界里,函数是一等公民,既可以作为独立的个体存在,也可以作为参数传递给其他函数,甚至可以作为返回值返回。这使得JavaScript函数拥有极高的灵活性,能够满足各种复杂的编程需求。
函数的四种调用模式
在JavaScript中,函数有四种调用模式,分别是:
- 函数调用形式
- 方法调用形式
- 构造器形式
- apply和call调用形式
函数调用形式
函数调用形式是最简单的调用方式,直接使用函数名加参数的方式调用函数,例如:
function sum(a, b) {
return a + b;
}
var result = sum(1, 2);
这种调用方式下,函数内部的this指向window对象(在严格模式下为undefined)。
方法调用形式
方法调用形式与函数调用形式类似,只是将函数作为对象的方法来调用,例如:
var obj = {
sum: function(a, b) {
return a + b;
}
};
var result = obj.sum(1, 2);
这种调用方式下,函数内部的this关键字指向该对象本身。
构造器形式
构造器形式用于创建对象,通过使用new关键字调用函数,例如:
function Person(name, age) {
this.name = name;
this.age = age;
}
var person = new Person('John', 30);
这种调用方式下,函数内部的this关键字指向新创建的对象。
apply和call调用形式
apply和call调用形式允许我们显式地指定函数内部的this关键字,语法如下:
func.apply(thisArg, argsArray);
func.call(thisArg, arg1, arg2, ...);
其中,thisArg指定函数内部的this关键字指向的对象,argsArray是一个包含参数的数组。
例如,我们可以使用apply和call调用形式来模拟函数的继承,例如:
function Parent(name) {
this.name = name;
}
function Child(name, age) {
Parent.apply(this, [name]);
this.age = age;
}
var child = new Child('John', 30);
这种调用方式下,Child函数内部的this关键字指向child对象,Parent函数内部的this关键字指向Parent对象。
函数传参技巧
在JavaScript中,函数参数的传递方式是传值,即函数内部对参数的修改不会影响函数外部的变量。
但是,我们可以通过使用对象或数组作为参数来实现传引用,例如:
function add(arr) {
arr.push(3);
}
var arr = [1, 2];
add(arr);
console.log(arr); // [1, 2, 3]
这种情况下,函数内部对arr的修改会影响函数外部的变量。
此外,我们还可以使用闭包来实现函数之间的传参,例如:
function outer() {
var a = 1;
function inner() {
console.log(a); // 1
}
return inner;
}
var innerFunc = outer();
innerFunc();
这种情况下,inner函数内部可以访问outer函数内部的变量a。
经典面试题
JavaScript函数的调用方式和传参技巧是经常出现在面试中的考察点,这里列举几个经典的面试题:
- 如何让函数内部的this关键字指向指定的