簡體   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