在JavaScript中,函数返回值是通过return语句来定义的。一个函数执行到return时,会立即结束执行,并将return后面的表达式的值返回给调用者。如果函数没有return语句,或者return后面不带任何值,函数默认返回undefined。理解return的执行机制和各种细节写法,是写出正确JS代码的前提。很多看似诡异的bug,比如函数返回了undefined、对象返回不出去,往往都和return的使用细节有关。

return语句的基本用法与执行机制
return语句的作用有两个:一是把值交还给调用方,二是终止函数执行。当JavaScript引擎执行到return时,当前函数的执行上下文会被销毁,控制权回到调用处,return后面的值就是函数调用表达式的结果。这个值可以直接赋给变量,也可以参与表达式运算,或者作为另一个函数的参数传递。
需要注意的是,return后面可以跟任意类型的值:基本类型如数字、字符串、布尔值,引用类型如对象、数组、函数,甚至是Promise。下面是一个基础示例:
function add(a, b) {
return a + b; // 返回两数之和,函数到此结束
}
function greet(name) {
// 没有return语句,调用后得到undefined
console.log('你好, ' + name);
}
const result = add(3, 5); // result 为 8
const nothing = greet('张三'); // nothing 为 undefined</code>还要注意return会立即中断函数,即使在循环中也是如此。很多初学者会在循环里写return想跳出循环但保留后续逻辑,结果函数整个结束了。如果只想跳出循环但继续执行函数后面的代码,应该用break而不是return,这是两者最本质的区别。
return的一个经典陷阱:分号自动插入
JavaScript有一套自动分号插入(ASI)机制,即引擎会在合适的位置自动补上分号。这个机制在return语句上会引发一个非常经典的bug:如果return单独成行,后面要返回的表达式写在下一行,引擎会在return后面自动插入分号,导致函数直接返回undefined。
function getPerson() {
return
{
name: '李四',
age: 25
};
}
console.log(getPerson()); // undefined,对象没返回出去!
// 正确写法:把左花括号紧跟在return后面
function getPersonFixed() {
return {
name: '李四',
age: 25
};
}
console.log(getPersonFixed()); // {name: '李四', age: 25}</code>上面的例子中,第一种写法return后面换行再写对象,引擎解析时相当于return;,对象字面量成了永远执行不到的死代码。第二种写法把左花括号写在return同一行,问题就解决了。这也是很多代码规范(如Airbnb规范)强制要求返回对象时左花括号必须与return同行,或者用一对圆括号包裹对象的原因。
同样的问题也出现在return一个多行表达式时,建议把表达式开头写在return同一行,或者用圆括号包裹整个表达式,这样可以彻底避免ASI机制带来的歧义。
箭头函数的隐式返回与函数返回多值
ES6引入的箭头函数为返回值提供了更简洁的写法。当函数体只有一条返回语句时,可以省略花括号和return,表达式的结果会自动作为返回值,这称为隐式返回。如果要隐式返回一个对象字面量,必须用圆括号包裹对象,否则花括号会被解析为函数体。
// 完整写法
const double = (x) => { return x * 2; };
// 隐式返回,等价于上面的写法
const double2 = (x) => x * 2;
// 隐式返回对象:必须加圆括号
const makeUser = (name, age) => ({ name: name, age: age });
// 错误写法:花括号被当作函数体,返回undefined
const wrong = (name) => { name: name };</code>隐式返回在数组遍历、Promise链式调用中特别常见,比如arr.map(x => x * 2)、.then(res => res.json()),代码简洁且可读性好。但要记住:一旦写了花括号,就必须显式写return,否则函数返回undefined。
另一个常见需求是让函数返回多个值。JavaScript函数本身只能返回一个值,但可以把多个值装进数组或对象里间接实现,再配合解构赋值取出:
function getMinMax(arr) {
const min = Math.min(...arr);
const max = Math.max(...arr);
return { min, max }; // 用对象封装多个返回值
}
const { min, max } = getMinMax([3, 1, 4, 1, 5]);
console.log(min, max); // 1 5</code>进阶:返回函数与高阶函数
JavaScript中函数是一等公民,因此函数的返回值也可以是另一个函数。返回函数的函数称为高阶函数,这是闭包、柯里化、函数工厂等高级模式的基础。掌握这种写法,能写出更灵活、可复用性更强的代码。
// 函数工厂:根据传入倍数生成新的乘法函数
function createMultiplier(factor) {
return function (num) {
return num * factor; // 闭包引用外部的factor
};
}
const triple = createMultiplier(3);
console.log(triple(10)); // 30
console.log(triple(7)); // 21
// 常见场景:给事件处理器绑定额外参数
function bindArgs(fn, ...presetArgs) {
return function (...restArgs) {
return fn(...presetArgs, ...restArgs);
};
}</code>高阶函数在数组的map、filter、reduce中大量使用,它们接收回调函数作为参数,而回调函数的返回值直接决定了处理结果。例如map依赖回调的返回值生成新数组,如果回调里忘记return,得到的将是一个全是undefined的数组,这是日常开发中出bug频率极高的场景。
此外,返回Promise也是现代开发中的常见模式。一个async函数总是返回Promise,即使函数体内return的是普通值,也会被自动包装成已完成的Promise。理解这一点,才能正确地在调用方使用await或then来获取返回值。
总结与实践建议
定义JS函数返回值的核心要点可以归纳为:用return定义返回值并终止函数;没有return时函数返回undefined;return后面要返回的对象或表达式必须写在同一行或用括号包裹,避免ASI陷阱;箭头函数可以隐式返回,但返回对象时要加圆括号;需要返回多个值时用对象或数组配合解构;函数还能返回函数,实现闭包和高阶函数模式。养成规范书写return的习惯,很多与undefined相关的诡异bug就能在源头避免。
JS函数返回值return语句JavaScript函数修改时间:2026-08-31 02:34:32