javascript - 为什么我可以在对象文字中对同一变量进行赋值时使用变量,但它会在函数文字中创建自引用?

标签 javascript

我为什么可以像这样回收对象文字中的变量:

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/

相关文章:

javascript - 在 svelte 中导入 javascript 文件

javascript - Node.js + Mongoose ...控制流问题?

javascript - Jquery切换问题

javascript - 如何修改它以使用数组中的所有项目?

用于下拉列表的 JavaScript 对象数组,仅使用某些属性

javascript - Angular Material 布局演示无法正常工作

javascript - 将信息从一个 div 传输到另一个 div 的更简单方法

javascript - 在thickbox内提交表单

php - 从列表元素运行 php

javascript - 我无法使用 Graph Api 创建事件