Javascript bind返回的结果与使用function()的结果有什么区别
bind的返回值与通过函数()创建等价项的结果之间有什么区别?有什么有效的区别吗?(我不是问Javascript bind返回的结果与使用function()的结果有什么区别,javascript,Javascript,bind的返回值与通过函数()创建等价项的结果之间有什么区别?有什么有效的区别吗?(我不是问bind的上下文保留属性)。是否有任何技术/性能原因使您可能更喜欢一种方法 i、 e vs #bind在IE8中不起作用。因此,在这种情况下,您可以使用第二个示例=),但最好将#bind实现为 有什么有效的区别吗 是否有任何技术/性能方面的原因使您可能更喜欢一个 接近 第二个版本包括一个附加的函数调用。没有技术上的区别,但有性能和无bug的区别。function.prototype中的所有函数都是由一些最
bind
的上下文保留属性)。是否有任何技术/性能原因使您可能更喜欢一种方法
i、 e
vs
#bind
在IE8中不起作用。因此,在这种情况下,您可以使用第二个示例=),但最好将#bind
实现为
有什么有效的区别吗
是否有任何技术/性能方面的原因使您可能更喜欢一个
接近
第二个版本包括一个附加的函数调用。没有技术上的区别,但有性能和无bug的区别。function.prototype中的所有函数都是由一些最优秀的开发人员按照所有程序员期望的特定规范编写的。当然,我们已经做了很好的测试 最好不要重新发明轮子,而且开发人员会比我们做得更好 注1:,所以不介意它是否支持绑定。在你的网站上有很多不支持的东西 注2:bind在chrome中的实现如下: 在chrome中编写开发控制台:
Function.prototype.bind
你会得到这样的结果
function(e,t){var n=this;return null!=t&&(t=Array.from(t)),function(){return n.apply(e,t||arguments)}}
好处:这里有一个非常类似的实现,可以获得更干净的代码(从Prototype.js复制.bind方法):
既然bind的返回值是一个函数,那么真的有额外的函数调用吗?对于本机不支持bind的浏览器,bind的许多实现都是通过function()@Tibrogargan来完成的,这个引用函数包装了
foo.call(未定义,bar)
在不支持bind的浏览器中,bind被实现为(改写)bind(thisObj,…{return function(){foo.call(thisObj,…);}
,因此在这些情况下没有[有效的]区别。支持它的浏览器也是这样吗?.bind()
和.call()
都是函数;console.log(Function.prototype.bind,Function.prototype.call)
。在这里可能是错误的,尽管第一个版本似乎最终调用了两个函数foo
,.bind
;第二个版本调用了三个函数匿名function(){}
,。call
运行了数百万次配置文件。bind()结果是380ms,函数是1001ms。Chrome将bind报告为本机代码-我觉得很有趣。谢谢你的回答。我认为guest271314的答案更接近实际。有一个技术上的区别-使用bind会更慢以获得相同的结果(有些人可能会认为它更易于维护)。代码可能是由优秀的开发人员编写的,但使用它却没有任何收获。这件事毫无意义。程序的速度与算法有关,如果bind执行0.1ms或0,2ms,没有人会理解不同之处,但只有在使用重复多次的算法时。如果你想执行如此复杂的时间(大o)算法不要使用javascript,在服务器上执行,确保使用最好的算法。谢谢。
var myFunc = function() { foo.call(undefined, bar) };
function(e,t){var n=this;return null!=t&&(t=Array.from(t)),function(){return n.apply(e,t||arguments)}}
Function.prototype.bind = function(){
var fn = this, args = Array.prototype.slice.call(arguments),
object = args.shift();
return function(){
return fn.apply(object,
args.concat(Array.prototype.slice.call(arguments)));
};
};