在js中,当返回对this值的引用与传递this reference关键字时,绑定时间有区别吗



我正在努力理解下面的代码,它可以防止函数静默地向回调函数传递回调函数参数中不需要的更多参数而导致的错误:

["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将参考parseIntthis将是调用函数时使用的任何this,可以是任何内容。在您的示例中:

["1","2","3"].map(parseInt.only(1))

this将是对全局对象的引用(在宽松模式下)或undefined(在严格模式下),因为map在调用回调时将使用undefined(在宽松方式下将变为对全局对象)。

this可能有几种不同的方式:

  1. 如果第二个参数被传递给map:

    ["1","2","3"].map(parseInt.only(1), {})
    // Second argument -----------------^^
    

    它在调用回调时将使用该值而不是CCD_ 23。

  2. 如果Function#bind用于函数only,则返回:

    ["1","2","3"].map(parseInt.only(1).bind({}))
    // Bind ---------------------------^
    

    则CCD_ 26将是该值。

  3. 如果only返回的函数是用callapply调用的(这就是map的作用,所以这是#1:-的一种重复),则将使用为this提供的值。

相关内容

  • 没有找到相关文章

最新更新