如何在参数与模块变量同名的函数中访问ES模块变量?
问题解答:函数参数与模块级变量同名的赋值问题
嘿,这个问题问得很精准!咱们来拆解清楚:
首先,你的原代码是不可行的,达不到你想要的“用参数给模块级date赋值”的效果。原因在于JavaScript的**变量作用域遮蔽(shadowing)**规则:函数参数date属于函数内部的局部变量,它会“覆盖”掉外部模块级的同名date变量——也就是说,你在函数里直接写date = xxx的时候,其实是在给这个局部的参数变量赋值,完全碰不到外面的模块级date。
那怎么解决呢?有两种常用方案:
方案一:给参数换个不同的名字(最推荐)
这是最直观、可读性最高的做法,完全避免了作用域混淆:
let date = null; export function setDate(newDate) { // 这里的date就是模块级的变量了 date = newDate; }
方案二:用对象包裹模块级变量(保留参数名的情况下)
如果你一定要保留参数名为date,可以把模块级变量放到一个对象里——因为对象是引用类型,不会被局部变量遮蔽:
// 用对象存储模块级变量 const dateStore = { date: null }; export function setDate(date) { // 通过对象属性访问,避开局部变量的遮蔽 dateStore.date = date; } // 后续要使用模块级date的话,就用dateStore.date
简单总结:直接用同名参数赋值模块级变量是行不通的,要么给参数换个名字,要么通过对象包裹的方式绕开作用域遮蔽。
内容的提问来源于stack exchange,提问作者Bernard
相关产品推荐
相关产品推荐

