函数声明是非静态的吗?
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
的单独绑定所以getX
和setX
关闭相同x
、getY
和 setY
一起关闭在不同的 x
上。
如果从未调用过useState
函数,则x
不会存储在任何地方,因为从未创建过useState
函数的记录。
【讨论】:
以上是关于函数声明是非静态的吗?的主要内容,如果未能解决你的问题,请参考以下文章