我正在努力理解下面的代码,它可以防止函数静默地向回调函数传递回调函数参数中不需要的更多参数而导致的错误:
["1","2","3"].map(parseInt)
返回[1, NaN, NaN]
,因为索引作为第二个参数传递给parseInt,后者接受它作为基数,因此数组值无效。为了解决这个问题,这篇博客文章的作者建议使用一个js扩展:
Function.prototype.only = function(numberOfArgs) {
var self = this; //the original function
return function() {
return self.apply(this,[].slice.call(arguments,0,numberOfArgs))
}
};
可以这样称呼:
["1","2","3"].map(parseInt.only(1))
我很难理解为什么"this"作为函数参数传递,而self则作为对此的引用返回。它们都指向parseInt,对吗?参数与返回值的绑定时间是否存在差异?
它们都指向parseInt,对吗?
否。
this
的值取决于函数的调用方式。
传递给map
的函数由map
的内部调用。
查看map
的文档。
如果提供thisArg参数进行映射,它将用作回调的this值。否则,未定义的值将用作其this值。
因此,如果返回的匿名函数使用this
而不是self
,那么它将调用undefined.apply
而不是parseInt.apply
。
我很难理解为什么"this"作为函数参数传递,而
self
作为对this
的引用传递。他们都指向parseInt
,对吗?
否。self
将参考parseInt
。this
将是调用函数时使用的任何this
,可以是任何内容。在您的示例中:
["1","2","3"].map(parseInt.only(1))
this
将是对全局对象的引用(在宽松模式下)或undefined
(在严格模式下),因为map
在调用回调时将使用undefined
(在宽松方式下将变为对全局对象)。
this
可能有几种不同的方式:
如果第二个参数被传递给
map
:["1","2","3"].map(parseInt.only(1), {}) // Second argument -----------------^^
它在调用回调时将使用该值而不是CCD_ 23。
如果
Function#bind
用于函数only
,则返回:["1","2","3"].map(parseInt.only(1).bind({})) // Bind ---------------------------^
则CCD_ 26将是该值。
如果
only
返回的函数是用call
或apply
调用的(这就是map
的作用,所以这是#1:-的一种重复),则将使用为this
提供的值。