You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在JavaScript的return语句中使用自动声明变量是否为良好实践?

在return语句中使用隐式全局变量的原理与风险

这种写法的本质

你看到的return info = ${name} is ${age}``,核心是赋值表达式的副作用:

  • info = ...是赋值操作而非变量声明。JS执行这个表达式时,会先在当前函数作用域查找info变量,找不到就向上遍历作用域链直到全局作用域。
  • 在非严格模式下,如果全局作用域也没有info,JS引擎会自动在全局作用域创建这个变量,并挂载到全局对象(浏览器中是window,Node.js中是globalThis)上——这就是你说的“自动声明变量”,本质是隐式全局变量。
  • 赋值表达式本身会返回赋值结果,所以return语句最终返回字符串的同时,偷偷在全局创建了info变量。

为什么这种写法绝对不能用

这属于JS历史遗留的反模式,风险远不止可读性问题:

  • 污染全局作用域:隐式创建的全局变量会和其他脚本、第三方库的变量重名,引发难以排查的冲突bug。
  • 语义混淆:return语句的核心语义是返回值,但这种写法偷偷附加了“创建全局变量”的副作用,其他开发者完全无法从字面逻辑预期到这个行为,维护成本极高。
  • 严格模式下直接报错:如果代码开启'use strict'(现代JS开发的标准做法),未声明就赋值的操作会直接抛出ReferenceError,导致代码崩溃。
  • 调试困难:全局变量的来源无法从代码结构直接追踪,出现问题时很难定位到是这个return语句创建的变量。

正确的替代方案

如果你需要获取函数返回的结果,直接在外部接收返回值即可,完全不需要依赖隐式全局变量:

let myP = document.getElementById("output");

function printInfos(name, age) {
  const info = `${name} is ${age}`;
  return info;
}

// 外部接收返回值,避免全局污染
const userInfo = printInfos("john", 4);
myP.textContent = userInfo;

如果确实需要全局变量(不推荐),也必须显式声明在全局作用域,让变量的来源清晰可见:

// 显式声明全局变量
let userInfo;
let myP = document.getElementById("output");

function printInfos(name, age) {
  userInfo = `${name} is ${age}`;
  return userInfo;
}

printInfos("john", 4);
myP.textContent = userInfo;

总结

这种写法是JS非严格模式下的历史遗留行为,属于严重的不良实践,无论什么场景都不应该使用。现代JS开发应始终遵循“显式声明变量”的原则,避免任何隐式全局变量的产生。

内容的提问来源于stack exchange,提问作者hugogogo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:45:55