我正在尝试理解下面的代码,该代码可以防止由函数静默传递给回调函数引起的错误更多参数,这些参数在回调函数的参数中是不需要的:
["1","2","3"].map(parseInt)
返回[1, NaN, NaN]
因为索引作为第二个参数传递给parseInt,后者将其作为基数接受,因此数组值无效。要解决这个问题,this blog post的作者建议使用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正确吗?参数与返回值的绑定时间是否存在差异?
答案 0 :(得分:2)
他们都指向parseInt正确吗?
没有
The value of this
depends on how a function is called.
传递给map
的函数由map
的内部调用。
如果提供了thisArg参数来映射,它将被用作回调此值。否则,未定义的值将用作此值。
因此,如果返回的匿名函数使用this
而不是self
,则会调用undefined.apply
而不是parseInt.apply
。
答案 1 :(得分:1)
我正在努力理解为什么"这个"作为函数参数传递,而
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 -----------------^^
...在调用回调时,它会使用该值而不是undefined
。
如果在Function#bind
函数上使用了only
,则返回:
["1","2","3"].map(parseInt.only(1).bind({}))
// Bind ---------------------------^
...然后this
就是那个价值。
如果使用only
或call
调用返回的函数apply
(这是map
所做的,那么这是#1的重复:-)),将使用this
提供的值。