我为什么可以像这样回收对象文字中的变量:
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());
关于javascript - 为什么我可以在对象文字中对同一变量进行赋值时使用变量,但它会在函数文字中创建自引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42658777/