Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 函数声明是非静态的吗?_Javascript_Reactjs_Function_Closures - Fatal编程技术网

Javascript 函数声明是非静态的吗?

Javascript 函数声明是非静态的吗?,javascript,reactjs,function,closures,Javascript,Reactjs,Function,Closures,我不确定我的措辞是否准确,但到目前为止,我一直认为javascript中的函数声明是“一成不变的” 当我试图更好地理解闭包(模仿React的useState的简化版本)时,我不确定以下代码块中的“x”存储在内存中的什么位置: 函数useState(){ 设x=0; 返回[function(){console.log(x)},function(y){x=y}]; } const[getX,setX]=useState(); getX() setX(1) getX()当函数(或任何块)运行时,将创

我不确定我的措辞是否准确,但到目前为止,我一直认为javascript中的函数声明是“一成不变的”

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

函数useState(){
设x=0;
返回[function(){console.log(x)},function(y){x=y}];
}
const[getX,setX]=useState();
getX()
setX(1)
getX()
当函数(或任何块)运行时,将创建一个新的函数,它本质上是该块中使用的变量名与它们包含的值的映射。如果在块完成后可以引用变量名,这通常称为“闭包”

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

const [getX, setX] = useState(); // Function called; record created
const [getY, setY] = useState(); // Function called again; another record created
如上所述,由于
useState
运行了两次,您创建了两个环境记录/闭包,每个记录/闭包分别绑定了
x
So
getX
setX
在相同的
x
上关闭,并且
getY
setY
一起在不同的
x
上关闭


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

让x
-这是您的
x
右侧,但这是否意味着它本质上是在原始函数声明中重写自己呢?这意味着当调用
function(y){x=y}
时,x存储了值。。。。这就是
setX
我想我对getter/setter仍然能够访问内部作用域感到困惑;我一直认为闭包处理的是能够访问外部作用域的问题。“getter”和“setter”是由
useState