在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
相关产品推荐
相关产品推荐

