繁体   English   中英

为什么我可以在分配给对象常量中相同变量的变量中使用变量,但是却在函数常量中创建自引用?

[英]Why can I use a variable in an assignment to that same variable in an object literal, but it creates a self-reference in a function literal?

我怎么能在这样的对象常量中回收变量:

var x=1;
x={
a:x;
}
console.log(x.a);//1

但不是函数文字

var y=2;
y=()=>y;
console.log(y()); //y() //?? why not 2?
console.log(y()()()()()()); //y()

无论x最初是否为基本类型,x的情况都有效。 y的情况似乎与箭头功能或标准功能相同。

我使用x大小写没有问题的方法将对象作为参数或字符串(然后将其转换为对象)。 对于函数我也有类似的情况(如果y是一个字符串,则使其成为返回该字符串的函数),但是它的工作方式不同。

我知道我可以像

var y=2;
let val=y;
y=()=>val;
console.log(y());//2

但是我不知道为什么有必要。

这与何时评估变量有关。

当你做

x={
a:x;
}

然后在那一刻读取x的当前值,并将其分配给属性a ,最后将新对象分配给x

x的评估发生将新值分配给x

y=()=>y;

该函数内部的变量( y )在调用该函数之前不会进行求值,稍后会发生。

y的评估发生将新值分配给y


您将覆盖现有变量的事实使此操作变得更加困难。 让我们看一个简单的例子:

var x = 42;
var obj = {a: x};
x = 21;
// logs 42 because that was the value of `x` at the moment the object was created
console.log(obj.a);


var y = 42;
var f = () => y;
y = 21;
// logs 21 because at the moment the function is called, the value of `y` has already 
// been updated
console.log(f()); 

为了增加本来很好的答案,可以使用闭包来通过将y的当前值存储在分配给y的函数的作用域链中来“使其工作”:

y = (x=>()=>x)(y);

简而言之,用y调用(x=>()=>x)首先将参数值xy ,然后返回一个嵌套函数,该x在其外部范围内返回x的值。

在创建嵌套函数时,异步代码中通常使用更复杂的闭包来引用和更新外部函数中定义的变量和参数的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM