簡體   English   中英

為什么Function.toString這樣工作?

[英]Why does Function.toString work this way?

該對象僅用於測試:

const item = {
    id: 520,
    name: 'Item 520',
    props: [
        {id: 1, name: 'Prop 1'},
        {id: 2, name: 'Prop 2'}
    ]
}

此函數將屬性ID作為參數,並返回從傳遞給它的項中獲取具有該ID的屬性的函數。

const getItemPropById = propId => (item => item.props.find(p => p.id === propId))

因此, getItemPropById(1)(item)計算結果為{id: 1, name: "Prop 1"}

getItemPropById.toString()返回

"propId => (item => item.props.find(p => p.id === propId))" 這里沒什么奇怪的。

現在,說我想要一個返回ID為1的屬性的函數。

const getItemPropWithId1 = getItemPropById(1)

此功能將按預期運行,

getItemPropWithId1.toString()返回

"item => item.props.find(p => p.id === propId)"

返回

"item => item.props.find(p => p.id === 1)"

因此,如果這是要執行的代碼,則getItemPropWithId1如何“知道”在propId時將其替換為1

它使用的變量是否存儲在其中的某個位置? 如果可以的話,是否可以訪問它們而不調用函數,就像可以訪問其代碼一樣?

一般來說,在任何給定對象上調用toString()的結果只會返回給您一個有用的字符串表示形式, 主要用於調試。 它應該可以幫助您了解它的作用。

沒有明確定義toString()作用是為您提供對象狀態的完整圖片。

例如,它是真實的getItempropWithId1將執行它顯示了代碼在它toString()即代碼是其狀態/內容的一部分 ),但是這還不是全部有。 除了該代碼之外,還有一個閉包,其中包含propId的值(在本例中為1)。 出於某種原因, toString()的作者選擇不在toString()輸出中包含該閉包(大概是因為閉包可能非常龐大,並且可能包含數千個任意大的對象,這會使平均toString()結果無用) 。

沒有通用方法可以直接訪問閉包中的值。 一些調試器將顯示它,但是您的代碼幾乎無法訪問它們。

TL;博士的代碼toString()示出了僅僅是什么定義的對象的一部分

“它使用的變量存儲在其中嗎?”

變量是在函數參數中定義的propId變量中“存儲”的(這是一個抽象,它實際上存儲在內存位置中,實現細節特定於實現)。

如果可以的話,是否可以訪問它們而不調用函數,就像可以訪問其代碼一樣?

沒有。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM