方法 vs. 函数
在 JavaScript 中,方法 和 函数 的语法非常相似,但有一个关键区别:

(图片来源网络,侵删)
- 函数:是独立存在的、可重复执行的代码块。
- 方法:是属于一个对象(Object)的函数,当你调用一个方法时,它通常与它所属的对象有关联。
一个函数,如果被赋值给一个对象的属性,那么这个函数就被称为该对象的方法。
// 这是一个函数
function sayHello() {
console.log('Hello!');
}
// 这是一个对象
const person = {
name: 'Alice',
// sayGreeting 是一个方法,因为它属于 person 对象
sayGreeting: function() {
console.log(`Hi, my name is ${this.name}.`);
}
};
// 调用函数
sayHello(); // 输出: Hello!
// 调用方法
person.sayGreeting(); // 输出: Hi, my name is Alice.
在上面的例子中,sayHello 是一个函数,而 sayGreeting 是 person 对象的一个方法,注意方法内部使用了 this 关键字,它指向当前方法所属的对象(即 person)。
JavaScript 方法的参数
参数是你在调用方法(或函数)时,传递给它的值,方法可以使用这些值来执行特定的操作。
基本参数传递
参数在方法定义时的括号内声明,在调用时按顺序传入。

(图片来源网络,侵删)
const calculator = {
// 定义一个 add 方法,它接受两个参数: a 和 b
add: function(a, b) {
return a + b;
},
// 定义一个 introduce 方法,它接受一个参数: name
introduce: function(name) {
return `Hello, ${name}!`;
}
};
// 调用 add 方法,并传入 5 和 3 作为参数
const sum = calculator.add(5, 3);
console.log(sum); // 输出: 8
// 调用 introduce 方法,并传入 "Bob" 作为参数
const greeting = calculator.introduce("Bob");
console.log(greeting); // 输出: Hello, Bob!
默认参数
ES6 引入了默认参数,允许你在方法定义时为参数指定一个默认值,如果调用方法时没有提供该参数,或者参数值为 undefined,则使用默认值。
const user = {
// 如果没有提供 name,默认值为 "Guest"
// 如果没有提供 age,默认值为 18
getInfo: function(name = "Guest", age = 18) {
return `Name: ${name}, Age: ${age}`;
}
};
console.log(user.getInfo()); // 没有传参,使用默认值
// 输出: Name: Guest, Age: 18
console.log(user.getInfo("Charlie")); // 只传了 name
// 输出: Name: Charlie, Age: 18
console.log(user.getInfo("David", 25)); // 传了两个参数
// 输出: Name: David, Age: 25
console.log(user.getInfo(undefined, 30)); // 显式传入 undefined,name 使用默认值
// 输出: Name: Guest, Age: 30
剩余参数
剩余参数允许你将一个不定数量的参数表示为一个数组,它使用三个点 () 来定义。
const blog = {
// posts 是一个数组,包含了所有传入的参数
printPosts: function(title, ...posts) {
console.log(`--- ${title} ---`);
posts.forEach((post, index) => {
console.log(`${index + 1}. ${post}`);
});
}
};
blog.printPosts("My Blog Posts", "Hello World", "JS Basics", "Advanced Topics");
/*
输出:
--- My Blog Posts ---
1. Hello World
2. JS Basics
3. Advanced Topics
*/
在这个例子中,title 接收第一个参数 "My Blog Posts",而剩下的所有参数都被收集到 posts 数组中。
解构参数
ES6 还允许你直接在方法参数中对对象或数组进行解构,这使得代码更简洁、更易读。

(图片来源网络,侵删)
对象解构:
const product = {
// 直接从传入的 object 参数中解构出 id 和 name
display: function({ id, name }) {
console.log(`Product ID: ${id}, Name: ${name}`);
}
};
const myProduct = { id: 101, name: "Laptop", price: 1200 };
product.display(myProduct); // 传入一个对象
// 输出: Product ID: 101, Name: Laptop
数组解构:
const listManager = {
// 直接从传入的 array 参数中解构出第一个和第二个元素
showFirstTwo: function([first, second]) {
console.log(`First: ${first}, Second: ${second}`);
}
};
const numbers = [10, 20, 30, 40];
listManager.showFirstTwo(numbers);
// 输出: First: 10, Second: 20
arguments 对象(较旧的方式)
在 ES6 之前,JavaScript 没有剩余参数,要获取所有传入的参数,需要使用一个名为 arguments 的特殊对象,它是一个类数组对象,包含了所有传递给方法的参数。
注意:虽然
arguments仍然可用,但在现代 JavaScript 中,推荐使用剩余参数 ,因为它是一个真正的数组,并且不会箭头函数中产生混淆。
const oldStylePrinter = {
printAllArgs: function() {
// arguments 对象包含了所有传入的参数
console.log(arguments); // 输出: [Arguments] { '0': 'a', '1': 'b', '2': 'c' }
// 遍历 arguments
for (let i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
}
};
oldStylePrinter.printAllArgs('a', 'b', 'c');
this 关键字(方法中的特殊参数)
this 是 JavaScript 中一个非常重要的关键字,尤其是在方法中,它的值取决于方法被调用的方式。
- 在方法中:
this通常指向该方法所属的对象。 - 在独立函数中:
this指向全局对象(在浏览器中是window,在 Node.js 中是global),或者在严格模式下是undefined。 - 在箭头函数中:
this继承自外层(词法)作用域,它没有自己的this。
const car = {
brand: 'Toyota',
start: function() {
console.log(`${this.brand} engine started.`);
},
// 箭头函数没有自己的 this,它会从外层作用域继承 this
// 在这个例子中,外层作用域是 car 对象
getBrand: () => {
console.log(this.brand); // 这里的 this 指向全局对象,所以会输出 undefined
}
};
car.start(); // 输出: Toyota engine started.
car.getBrand(); // 输出: undefined
| 概念 | 描述 | 示例 |
|---|---|---|
| 方法 | 属于一个对象的函数。 | const obj = { myMethod() {} }; |
| 参数 | 调用方法时传递给它的值。 | obj.myMethod('value'); |
| 默认参数 | 为参数提供默认值。 | function myFunc(a = 1) {} |
| 剩余参数 | 将不定数量的参数收集到一个数组中。 | function myFunc(a, ...b) {} |
| 解构参数 | 直接从传入的对象或数组中提取值。 | function myFunc({a, b}) {} |
this |
在方法中,指向调用该方法的对象。 | console.log(this.name); |
理解方法和参数是掌握 JavaScript 面向对象编程和函数式编程的基础,希望这个详细的解释能帮助你!
