[英]Exactly how do destructuring assigments in function arguments work?
我不明白為什么函數調用中的解構邏輯實際上是在聲明一個新變量。
function fn() {} let object = {x: "Ele", y: "From", z: "Stack"}; fn({x} = object); console.log(x);
其次,下面邏輯中的問題是什么。 我得到了Uncaught ReferenceError: x is not defined
。 但是,當我使用var
工作正常。
function fn() {} let object = {x: "Ele", y: "From", z: "Stack"}; fn({x} = object); let x = "Dummy"; console.log(x);
我對之前的邏輯缺乏了解。
......實際上聲明了一個新變量
這就是我所說的“隱形全球恐怖” 。 這一行:
fn({x} = object);
有效地:
({x} = object);
fn(object); // a bit of hand-waving here, but roughly speaking...
由於它分配給未聲明的變量,因此它會創建一個全局變量。 如果你使用嚴格模式,你會得到一個ReferenceError:
"use strict"; function fn() {} let object = {x: "Ele", y: "From", z: "Stack"}; fn({x} = object); console.log(x);
賦值的結果是賦值。 在解構賦值的情況下,分配的值是被解構的東西( object
的值,在您的情況下)。
......其次,下面邏輯中的問題是什么。 我得到了
Uncaught ReferenceError: x is not defined
添加let x
時的問題是分配給x
的行現在位於時間死區中,用於聲明x
。 x
在該點保留 ,但未初始化。 錯誤消息顯示“未定義”,因為let x
行尚未執行。 好像你有:
x = 0;
let x;
首先回答第二個問題:在聲明之前,不能使用let
(在本例中為x
)聲明的變量。 在執行{ x } =
你會解構為x
。
現在當你執行fn({ x } = object)
,它基本上是一個函數調用,其第一個參數是賦值表達式,並且總是求值為右側的結果。 a=b
求值為b
, {x} = object
求值為object
。
我不明白為什么函數調用中的解構邏輯實際上是在聲明一個新變量。
對尚未聲明的標識符的任何賦值都會隱式創建全局變量。 "use strict"
模式來防止這種情況發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.