NodeJS中this访问全局变量返回undefined及会话变量需求问询
问题分析与解决方案
先给你拆解清楚两个核心点:为什么this.common_admin_users_param会返回undefined,以及怎么实现「带默认值、每个会话独立副本」的需求。
为什么会出现undefined?
在Node.js环境里,和浏览器的全局变量逻辑不一样:
- 用
var声明的顶层变量**不会自动挂载到全局对象(global)**上,而你直接调用getAdminUserParams()时,函数内部的this指向的是global对象(非严格模式下),所以this.common_admin_users_param自然找不到对应的值,返回undefined。 - 顺便提一句:Node.js里没有浏览器的
alert()方法,调试应该用console.log()哦~
如何实现「每个会话独立的带默认值变量」?
全局变量是所有会话共享的,完全不符合你的需求。我们可以用闭包工厂函数或者ES6类来创建独立实例,每个实例都拥有自己的参数副本:
方案1:闭包工厂函数(简洁灵活)
// 工厂函数,每次调用都会生成独立的参数实例 function createAdminUserSessionParams() { // 这里的变量是闭包变量,每个会话实例独占一份 let adminParams = { Limit: 60, GroupName: "admin", NextToken: undefined }; return { // 获取参数(返回副本避免外部直接修改原对象) getParams: () => ({...adminParams}), // 更新参数 updateParams: (newParams) => Object.assign(adminParams, newParams) }; } // 会话1的独立参数 const session1 = createAdminUserSessionParams(); console.log(session1.getParams()); // 输出默认值 // 会话2的独立参数,修改不会影响会话1 const session2 = createAdminUserSessionParams(); session2.updateParams({ Limit: 100, NextToken: "abc123" }); console.log(session2.getParams()); // 输出修改后的值 console.log(session1.getParams()); // 还是原来的默认值
方案2:ES6类(结构化易维护)
如果你更喜欢面向对象的写法,用类也能轻松实现:
class AdminUserSessionParams { constructor() { // 实例属性,每个new出来的实例都有独立副本 this.adminParams = { Limit: 60, GroupName: "admin", NextToken: undefined }; } getParams() { return {...this.adminParams}; } updateParams(newParams) { Object.assign(this.adminParams, newParams); } } // 创建两个完全独立的会话实例 const sessionA = new AdminUserSessionParams(); const sessionB = new AdminUserSessionParams();
额外补充
如果你只是单纯想在函数里访问那个全局变量(不考虑会话独立),直接去掉this就行:
var common_admin_users_param = { Limit: 60, GroupName: "admin", NextToken: undefined }; function getAdminUserParams() { console.log(common_admin_users_param); // 能正常输出 } getAdminUserParams();
但这种方式是共享变量,所有会话都会用同一个对象,显然不是你想要的效果。
内容的提问来源于stack exchange,提问作者Jayesh Dhandha
相关产品推荐
相关产品推荐

