传递这个javascript函数调用的解释

时间:2016-02-04 15:30:29

标签: javascript javascript-objects

我正在阅读“Javascript the Good Parts”一书,并尝试了一些例子来理解这些概念。我遇到了一个例子,无法理解。请查看下面的代码,让我了解我的错误:

//Augmenting the Function prototype with method
Function.prototype.method = function(name, func){
  if (typeof this.prototype[name] !== "function"){
      this.prototype[name]=func;
    return this;
  }
}

// why do we have the (this) at the end of the return statement.
/*Number.method("integer", function(){
  return Math[this < 0 ? 'ceil': 'floor'](this);
});*/

//According to me the function should have been like below:
Number.method("integer", function(val){ // we get a function and we need to pass the value and the value will be evaluated and returned.
  return Math[val < 0 ? 'ceil': 'floor'];
});
//According to my understanding the calling function should be something like below.
alert((-10/3).integer(-10/3);

我知道我的方法不起作用,但很难找到理由。请用一些例子来更新我以强化概念。

分享小提琴的链接 - Fiddle - link

2 个答案:

答案 0 :(得分:1)

  

根据我的理解,调用函数应该类似于(-10/3).integer(-10/3)

这就是你误解的地方。你为什么要重复这个号码?不,方法应该被称为

(-10/3).integer() // -3

没有任何参数 - 它所处理的值是Number实例(方法中的this)。

如果您要将数字作为参数传递,则不需要将其作为方法,而应该是静态函数:

Number.integer = function(val) {
    return Math[val < 0 ? 'ceil': 'floor'](val);
//                                         ^^^ still passing it here, of course
};
Number.integer(-10/3) // -3

这也是可行的,特别是当参数不能保证为数字时,各种静态NumberMath函数都可以看出。

答案 1 :(得分:1)

Math[val < 0 ? 'ceil': 'floor']是一个功能。考虑Math.ceilMath.floor

因此,您添加到Number的方法将返回函数而不是值。

虽然在行的末尾添加(this)将使用caller的值调用此函数,在您的情况下为-10/3。因此它会将预期值返回给您。