我在思考这个函数时遇到了一些麻烦:
var toStr = Function.prototype.call.bind( Object.prototype.toString );
toStr([]) // [object Array]
如第 2 行所示,此函数如何接受参数?
最佳答案
嗯,
Function.prototype.call
引用“call”函数,该函数用于调用具有选定的this
值的函数;- 随后的
.bind
引用 Function 原型(prototype)上的“bind”函数(记住:“call”也是一个函数),它返回一个总是有this 的新函数
设置为传入的参数。 - 传递给“bind”的参数是 Object 原型(prototype)上的“toString”函数,因此整个表达式的结果是一个新函数,它将运行带有
this
集的“call”函数到“toString”函数。
因此,结果就像这段代码:Object.prototype.toString.call(param)
。然后,“console.log”调用将一个数组传递给该函数,这样就可以了。
编辑 请注意,Object.prototype.toString.call( param )
实际上就像 param.toString()
,当“param”是一个对象。如果不是,那么“call”函数的语义就是按照 JavaScript 的正常方式将它变成一个函数(数字 -> 数字,字符串 -> 字符串等)。
编辑,2016 年 5 月 24 日 — 上面的最后一句话在 ES2015 中并不准确。新的 JavaScript 运行时不会“自动装箱”原始类型,当它们涉及作为 this
值的函数调用时。
关于javascript - Function.prototype.call.bind 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11121586/