关于toString的自动调用

首先看一道函数
在这里插入图片描述
结果alert为6
这里涉及到这个toString的自动调用问题!
在这里插入图片描述

这里log一下add(1)发现打印了字符串形式的tmp函数的函数体,但是类型为函数
在这里插入图片描述

然后再看这道
在这里插入图片描述
看结果,注意这个函数的执行顺序:
在这里插入图片描述
fn(1)函数调用开始,从上到下,先打印了‘第一次’,然后return help,注意!return后面如果为函数体的话,为了输出字符串会自动调用toString方法,也即是会自动执行这里的help.toString()!
意思即是就算这个函数里面没有这个help.toString(),也会自己调用,自己转化为字符串函数,如图:
在这里插入图片描述
注释掉help.toString()后,结果区别不过是多打印了里面的一句话而已
在这里插入图片描述
同时这也说明了,加help.toString()是使用我们改写的toString()方法,而不是使用它底层的
所以这里的.toString()其实是我们改写了方法,
在这里插入图片描述
打印两个的类型后,
在这里插入图片描述
这里debugger知道调用typeof方法去检测函数的调用结果时,也会执行函数,但是有一个很大的区别就是不会走到return语句,因为根本不需要走到return即可判断出类型,即相当于先调用了函数,但是走到了return的前一句结束再进行类型检测,猜测是源码是这样写,然后由这里也可以看出:
首先对test.toString()的源码猜测一波是:return成了一个’test ',就是return成一个字符串!
然后注意看这两个的区别:
console.log(fn(1));
在这里插入图片描述

console.log(fn(1).toString());
在这里插入图片描述
注意执行顺序问题:
看下console.log(fn(1))的debugger;
在这里插入图片描述
本来是先打印出help ===tostring的,后面下一步debugger时,
在这里插入图片描述
这个打印直接到中间了!
这说明函数的调用完成、或者说log的完成比去调用toString快一步,(猜测是源码引起的,因为本来字符串转变都是需要在最后面,有逻辑的要先完成才去转变为字符串,否则你要是比人家逻辑快,你先一步转变为字符串,后面人家逻辑中有可能会转为其他类型),所以说你先一步完成函数的调用,toString里面的逻辑就慢一些,return的值也取不到,所以说toString()方法要在函数调用完成后使用,
这就是fn(1)与fn(1).toString()的区别所在了,加上toString方法后,与函数的调用形成一个整体,即fn(1).toString()为一个整体,在这里debugger后,发现你调用了toString(),直接输出!FuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1ZlZ2V0YWJsZUtDQ0ND,size_16,color_FFFFFF,t_70)在

在这里插入图片描述
结合下面的图或许更容易理解:可以看出,return语句是执行了的,b不断的在变化
在这里插入图片描述
在这里插入图片描述
而alert()的参数接收为对象,如果里面是为对象,就会自动调用toString方法,而函数也为对象,所以alert(fn(1))相当于在fn(1).toString()

看一下一样的代码,mdn这边的编辑器给的结果:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
猜测是这边的fn(1) = vs的fn(1).toString(),所以中间的部分才会不同,help===tostring才打印了两次!!

然后回到这道题,
首先add(1)是返回一个函数tmp,然后toString那里是返回sum=1,add返回tmp函数
然后add(1)(2)就是tmp(2),然后toString那里是返回sum=3,add返回tmp函数
再然后add(1)(2)(3)就是tmp(3),然后toString那里是返回sum=6,add返回tmp函数
最后alert自动调用toString方法,输出6
在这里插入图片描述

好了,这个函数的理解就到这里了,这个地方坑了我一天,希望能对小伙伴们有所帮助,以上全部是个人理解,若哪里出错,欢迎指正!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值