为什么 Function.toString 以这种方式工作?

此对象仅用于测试:


const item = {

    id: 520,

    name: 'Item 520',

    props: [

        {id: 1, name: 'Prop 1'},

        {id: 2, name: 'Prop 2'}

    ]

}

此函数将属性 id 作为参数,并返回函数,该函数从传递给它的 item 中获取具有该 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,当它叫什么名字?


它使用的变量是否存储在其中的某处?如果是这样,我可以在不调用函数的情况下访问它们,就像我可以访问它的代码一样吗?


慕标5832272
浏览 227回答 2
2回答

慕哥6287543

一般来说,调用toString()任何给定对象的结果只是返回一个有用的字符串表示,主要用于调试。它应该可以帮助您了解它的作用。什么toString()是明确不定义做的就是给你一个完整的对象的状态的照片。例如,它是真的,getItempropWithId1将执行它显示了它的代码toString()(即代码部分的状态/内容的),但是这还不是全部有。除了该代码之外,还有一个包含propId(1,在本例中)的值的闭包。出于某种原因,作者toString()选择不在toString()输出中包含该闭包(大概是因为闭包可能非常庞大,并且可能包含数千个任意大的对象,这将使平均toString()结果无用)。没有通用的方法可以直接访问闭包中的值。一些调试器会显示它,但您的代码几乎无法访问它们。TL;博士的代码toString()示出了仅仅是部分的什么定义的对象。

aluckdog

“它使用的变量是否存储在其中的某个地方?”变量“存储”在propId您在函数参数中定义的变量中(这是一个抽象,它实际上存储在内存位置中,并且实现细节特定于实现)。如果是这样,我可以在不调用函数的情况下访问它们,就像我可以访问它的代码一样吗?不。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript