为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕标5832272 2021-10-14 12:55:57
此对象仅用于测试: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,当它叫什么名字?它使用的变量是否存储在其中的某处?如果是这样,我可以在不调用函数的情况下访问它们,就像我可以访问它的代码一样吗?
查看完整描述

2 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

一般来说,调用toString()任何给定对象的结果只是返回一个有用的字符串表示,主要用于调试。它应该可以帮助您了解它的作用。

什么toString()是明确定义做的就是给你一个完整的对象的状态的照片。

例如,它是真的,getItempropWithId1将执行它显示了它的代码toString()(即代码部分的状态/内容的),但是这还不是全部有。除了该代码之外,还有一个包含propId(1,在本例中)的值的闭包。出于某种原因,作者toString()选择不在toString()输出中包含该闭包(大概是因为闭包可能非常庞大,并且可能包含数千个任意大的对象,这将使平均toString()结果无用)。

没有通用的方法可以直接访问闭包中的值。一些调试器会显示它,但您的代码几乎无法访问它们。

TL;博士的代码toString()示出了仅仅是部分的什么定义的对象。


查看完整回答
反对 回复 2021-10-14
?
aluckdog

TA贡献1847条经验 获得超7个赞

“它使用的变量是否存储在其中的某个地方?”

变量“存储”在propId您在函数参数中定义的变量中(这是一个抽象,它实际上存储在内存位置中,并且实现细节特定于实现)。

如果是这样,我可以在不调用函数的情况下访问它们,就像我可以访问它的代码一样吗?

不。


查看完整回答
反对 回复 2021-10-14
  • 2 回答
  • 0 关注
  • 226 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信