在js中返回对此值的引用vs传递此引用关键字时,绑定时间是否存在差异?

时间:2017-11-02 10:06:11

标签: javascript

我正在尝试理解下面的代码,该代码可以防止由函数静默传递给回调函数引起的错误更多参数,这些参数在回调函数的参数中是不需要的:

["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正确吗?参数与返回值的绑定时间是否存在差异?

2 个答案:

答案 0 :(得分:2)

  

他们都指向parseInt正确吗?

没有

The value of this depends on how a function is called.

传递给map的函数由map的内部调用。

请看the documentation for map

  

如果提供了thisArg参数来映射,它将被用作回调此值。否则,未定义的值将用作此值

因此,如果返回的匿名函数使用this而不是self,则会调用undefined.apply而不是parseInt.apply

答案 1 :(得分:1)

  

我正在努力理解为什么"这个"作为函数参数传递,而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 -----------------^^
    

    ...在调用回调时,它会使用该值而不是undefined

  2. 如果在Function#bind函数上使用了only,则返回:

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

    ...然后this就是那个价值。

  3. 如果使用onlycall调用返回的函数apply(这是map所做的,那么这是#1的重复:-)),将使用this提供的值。