Function.prototype.call.bind如何工作?

lev*_*evi 29 javascript prototype

我在围绕这个功能时遇到了一些麻烦:

var toStr = Function.prototype.call.bind( Object.prototype.toString );
toStr([]) // [object Array]???????????????????????????
Run Code Online (Sandbox Code Playgroud)

该函数如何接受第2行中的参数?

Poi*_*nty 29

好,

  • Function.prototype.call引用"call"函数,该函数用于调用具有所选this值的函数;
  • 后面.bind引用Function原型上的"bind"函数(记住:"call"也是一个函数),它返回一个总是this设置为传入参数的新函数.
  • 传递给"bind"的参数是Object原型上的"toString"函数,因此整个表达式的结果是一个新函数,它将运行"call"函数并this设置为"toString"函数.

因此,结果就像这段代码:Object.prototype.toString.call( param ).然后,"console.log"调用将该函数传递给一个数组,然后就可以了.

编辑当"param"是一个对象时,注意Object.prototype.toString.call( param )就像param.toString()真的一样.当它不是时,那么"调用"函数的语义就是以JavaScript的正常方式将它变为一个(数字 - >数字,字符串 - >字符串等).

编辑,2016年5 月24日 - 上述最后一句话与ES2015不准确.当函数调用作为值时,新的JavaScript运行时不会 "autobox"原始类型this.


Esa*_*ija 9

我假设你已经知道什么.call.bind

toStr 现在是一个基本上做的功能:

function toStr( obj ) {
    return Function.prototype.call.call( Object.prototype.toString, obj );
}
Run Code Online (Sandbox Code Playgroud)

IE .call.call函数的上下文参数设置的.toString函数.通常情况下,该部分已经被处理,因为您通常将.call某个函数的属性用作设置函数的上下文.call.