从原型定义函数访问变量:持久化与跨函数获取方法咨询
解决方案:保留函数内变量状态及跨函数访问问题
针对你提出的两个问题,我来逐一给出实用的实现方案,附带代码示例方便你理解:
问题1:让value1和value2在函数退出后保持已定义状态
函数内部的局部变量默认在函数执行完毕后会被垃圾回收,要保留它们的状态,常用这几种方式:
1. 使用全局变量(简单但需注意作用域污染)
把变量定义在函数外部的全局作用域,函数内部只负责修改它们的值:
// 全局作用域定义变量 let value1, value2; function doSomething() { value1 = "foo"; value2 = "bar"; } doSomething(); // 函数退出后,value1和value2依然存在 console.log(value1); // 输出 "foo"
2. 闭包(推荐,避免全局污染)
利用闭包的特性,让内部变量被外部函数引用,从而保留状态:
function createStateHolder() { let value1, value2; return { doSomething: function() { value1 = "foo"; value2 = "bar"; }, getValues: function() { return { value1, value2 }; } }; } const state = createStateHolder(); state.doSomething(); // 函数退出后,通过闭包依然能访问value1和value2 const { value1, value2 } = state.getValues(); console.log(value1, value2); // 输出 "foo bar"
3. 模块模式(适合复杂场景,封装性更好)
用IIFE(立即执行函数表达式)创建私有作用域,暴露公共方法来操作和访问变量:
const stateModule = (function() { let value1, value2; return { doSomething: function() { value1 = "foo"; value2 = "bar"; }, getValue1: function() { return value1; }, getValue2: function() { return value2; } }; })(); stateModule.doSomething(); console.log(stateModule.getValue1()); // 输出 "foo"
问题2:不调用doSomething的前提下,在另一函数中获取这两个变量的值
这里要注意:如果value1和value2原本是doSomething内部的局部变量,不调用函数的话这些变量根本不会被创建。所以要实现这个需求,得提前把变量放在外部可访问的作用域,让另一个函数能直接访问,同时doSomething只是负责初始化/修改它们:
方案1:提前在共享作用域定义变量
// 定义在两个函数都能访问的作用域(比如模块作用域或全局作用域) let value1 = "default1"; let value2 = "default2"; function doSomething() { value1 = "updated foo"; value2 = "updated bar"; } function anotherFunction() { // 不需要调用doSomething,直接访问变量 console.log(value1, value2); // 输出 "default1 default2" } anotherFunction(); // 如果之后调用doSomething,anotherFunction再执行会拿到更新后的值 doSomething(); anotherFunction(); // 输出 "updated foo updated bar"
方案2:用闭包提前初始化变量(无需调用doSomething也有初始值)
const stateHolder = (function() { // 提前初始化变量,不需要调用doSomething也能访问 let value1 = "initial foo"; let value2 = "initial bar"; return { doSomething: function() { value1 = "updated foo"; value2 = "updated bar"; }, getValues: function() { return { value1, value2 }; } }; })(); function anotherFunction() { const { value1, value2 } = stateHolder.getValues(); console.log(value1, value2); // 输出 "initial foo initial bar" } anotherFunction(); // 无需调用doSomething就能获取值
总结一下:如果要保留变量状态,闭包和模块模式是比全局变量更优雅的选择;如果要在不调用doSomething的情况下访问变量,必须让变量在doSomething执行前就存在于共享作用域中。
内容的提问来源于stack exchange,提问作者makusa
相关产品推荐
相关产品推荐

