[英]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.