1 | var toStr1 = Function.prototype.call.bind(Object.prototype.toString); |
这句你看懂了吗?(这是我在看框架时,看到的一行代码。。。。。我是第一次见)
我的第一感觉:call?bind?还能这样用?你想干啥?
然后我就调用了一下:
1 | var toStr1 = Function.prototype.call.bind(Object.prototype.toString); |
从上面的实际操作输出结果来看,这就是一个检验对象类型的一个东东。
可能你见过较多的检测类型的是下面的这种写法:
1 | var toStr2 = obj => Object.prototype.toString.call(obj); |
(呃…….这种我见的好像也不多。但是这能正常理解啊)
大家想必也都比较清除call和bind两种方法,实际本质上两种方法没有太大区别(我觉得),但是为啥大家在框架级代码中常常见到的是第一种,而并非第二种(代码逻辑清晰,理解起来更加容易,最重要能实现同样的需求)。
经过本人通过度娘了解到,这是为了“防止原型污染”。(呃…….我有懵比了)
下面是我了解后进行的一些代码操作运行:
1 | var toStr1 = Function.prototype.call.bind(Object.prototype.toString); |
第一种可以,第二种竟然挂了,为啥
给出的解释:我们知道bind函数返回结果是一个函数,这个函数是函数内部的函数,会被延迟执行,那么很自然联想到这里可能存在闭包!因为闭包可以保持内部函数执行时的上下文状态(还有很多“废话”,大家有兴趣可以自行百度,我lan)
拓:
顺便给大家贴一段代码自行领悟:
1 | var toStr3 = Function.call.bind(Object.prototype.toString); |