能否将全局变量名以字符串传入函数,实现对该变量的操作?含特殊场景
当然可以实现这个需求!我来给你详细说明~
首先针对你提到的localStorage、sessionStorage这类全局变量的场景,在浏览器环境里,所有全局变量本质上都是window对象的属性,所以我们可以直接通过字符串索引访问window对象来拿到目标变量,进而调用它的方法。
示例实现代码
function setStorage(str, key, value) { // 通过window[str]获取对应的全局对象(比如localStorage/sessionStorage) const targetObj = window[str]; // 先做个校验,避免不存在或没有对应方法的情况 if (targetObj && typeof targetObj.setItem === 'function') { targetObj.setItem(key, value); } else { console.error(`无法操作对象:${str} 不存在或缺少setItem方法`); } } // 调用示例 setStorage('localStorage', 'user_id', '12345'); setStorage('sessionStorage', 'temp_token', 'abcdef');
关于补充提问的两种特殊情况:
1. 非window对象的全局变量(比如Node.js环境)
如果是在Node.js这类非浏览器环境,全局变量挂载在global对象上(ES2020之后推荐用globalThis,它是跨环境的统一全局对象),同样可以用字符串索引的方式访问:
// 先定义一个自定义全局对象 globalThis.myCustomGlobal = { setItem: function(key, val) { this[key] = val; console.log(`已设置 ${key}: ${val}`); } }; function operateGlobal(str, key, value) { const targetObj = globalThis[str]; if (targetObj && typeof targetObj.setItem === 'function') { targetObj.setItem(key, value); } } // 调用测试 operateGlobal('myCustomGlobal', 'theme', 'light');
2. 关于this的情况
this比较特殊,它不是一个可通过名称引用的变量,而是当前执行上下文的动态值,没办法直接通过字符串来“获取”它。如果你的需求是让函数操作某个指定的this对象,有两种思路:
- 直接把目标对象作为参数传入,而不是传字符串;
- 通过
call/apply来改变函数执行时的this指向。
举个例子:
function operateThis(key, value) { if (this && typeof this.setItem === 'function') { this.setItem(key, value); } } // 调用时用call指定this为localStorage operateThis.call(localStorage, 'username', 'Alice');
总结一下:
- 所有挂载在全局对象(
window/global/globalThis)上的变量,都可以通过字符串名称访问全局对象的对应属性来操作; this是动态上下文值,无法通过字符串名称获取,需要直接使用或通过调用方式指定;- 跨环境开发推荐用
globalThis,它能兼容浏览器、Node.js等多种环境。
内容的提问来源于stack exchange,提问作者sof-03
相关产品推荐
相关产品推荐

