• 欢迎大家分享资料!前往留言板评论即可!

一句JS代码

合宙 模组资料网 1年前 (2021-05-15) 166次浏览 已收录 0个评论 扫描二维码
var toStr1 = Function.prototype.call.bind(Object.prototype.toString);

这句你看懂了吗?(这是我在看框架时,看到的一行代码。。。。。我是第一次见)
我的第一感觉:call?bind?还能这样用?你想干啥?

然后我就调用了一下:

var toStr1 = Function.prototype.call.bind(Object.prototype.toString);

toStr1({})
"[object Object]"


toStr1('aaaa')
"[object String]"


toStr1(1111)
"[object Number]"

从上面的实际操作输出结果来看,这就是一个检验对象类型的一个东东。

可能你见过较多的检测类型的是下面的这种写法:

var toStr2 = obj => Object.prototype.toString.call(obj);

(呃…….这种我见的好像也不多。但是这能正常理解啊)

大家想必也都比较清除call和bind两种方法,实际本质上两种方法没有太大区别(我觉得),但是为啥大家在框架级代码中常常见到的是第一种,而并非第二种(代码逻辑清晰,理解起来更加容易,最重要能实现同样的需求)。
经过本人通过度娘了解到,这是为了“防止原型污染”。(呃…….我有懵比了)
下面是我了解后进行的一些代码操作运行:

var toStr1 = Function.prototype.call.bind(Object.prototype.toString);

var toStr2 = obj => Object.prototype.toString.call(obj);

Object.prototype.toString = function(){
  return 'toString方法被覆盖!';
}
// 接着我们再调用上述方法

// toStr1
console.log(toStr1({}));      // "[object Object]"
console.log(toStr1(123));     // "[object Number]"
console.log(toStr1("abc"));   // "[object String]"

// toStr2
console.log(toStr2({}));      // "toString方法被覆盖!"
console.log(toStr2(123));     // "toString方法被覆盖!"
console.log(toStr2("abc"));   // "toString方法被覆盖!"

第一种可以,第二种竟然挂了,为啥
给出的解释:我们知道bind函数返回结果是一个函数,这个函数是函数内部的函数,会被延迟执行,那么很自然联想到这里可能存在闭包!因为闭包可以保持内部函数执行时的上下文状态(还有很多“废话”,大家有兴趣可以自行百度,我lan)

拓:
顺便给大家贴一段代码自行领悟:

var toStr3 = Function.call.bind(Object.prototype.toString);
var toStr4 = Function.call.call.bind(Object.prototype.toString);
var toStr5 = Function.call.call.call.bind(Object.prototype.toString);

转载请注明原文链接:一句JS代码
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址