函数声明是非静态的吗?

Posted

技术标签:

【中文标题】函数声明是非静态的吗?【英文标题】:Are function declarations non-static? 【发布时间】:2021-01-05 21:57:38 【问题描述】:

我不确定我是否准确地表达了这个问题,但到目前为止,我一直认为 javascript 中的函数声明是“一成不变的”。

当我试图更好地理解闭包(模仿 React 的 useState 的简化版本)时,我开始不确定以下代码块中的“x”在内存中的存储位置:

function useState () 
    let x = 0;
    return [function()  console.log(x) ,function (y)  x = y];


const [getX, setX] = useState(); 
getX()
setX(1)
getX()

所以当 useState 函数返回一个 getter 和一个 setter 作为变量“getX”和“setX”时,“x”究竟存储在哪里?在useState的原始声明中?我在这里错过了什么?

【问题讨论】:

let x - 你的x 对,但这是否意味着它本质上是在原始函数声明中重写自己? 表示x存储了调用function (y) x = y时的值....也就是setX 我想我对 getter/setter 仍然能够访问内部范围感到困惑;我一直认为闭包处理的是能够访问外部作用域。 “getter”和“setter”useState返回的函数 【参考方案1】:

当一个函数(或任何块)运行时,会创建一个新的Environment Record,它本质上是在该块中使用的变量名到它们包含的值的映射。如果在块完成后可以引用变量名,这就是通常所说的“闭包”。

每次函数运行时,都会创建一个新的此类记录。这个记录关闭是你的x 被存储的地方。这也是为什么您可以多次调用 useState 并将结果分开的原因:

const [getX, setX] = useState(); // Function called; record created
const [getY, setY] = useState(); // Function called again; another record created

上面,由于useState 运行了两次,您已经创建了两个 环境记录/闭包,每个都具有x 的单独绑定所以getXsetX 关闭相同xgetYsetY 一起关闭在不同的 x 上。

如果从未调用过useState 函数,则x 不会存储在任何地方,因为从未创建过useState 函数的记录。

【讨论】:

以上是关于函数声明是非静态的吗?的主要内容,如果未能解决你的问题,请参考以下文章

将线程函数声明为静态函数的问题

RestTemplate 应该是静态全局声明的吗?

析构函数可以是最终的吗?

私有静态变量

单例实例声明为 GetInstance 方法的静态变量,它是线程安全的吗? [复制]

单例实例声明为 GetInstance 方法的静态变量,它是线程安全的吗? [复制]