Math对象的这个扩展很有效:
var MathClassExtensions = {
randomNumber: function(minimum, maximum){
return Math.round( Math.random() * (maximum - minimum) + minimum );
}
};
$.extend(Math, MathClassExtensions);
Math.randomNumber(4,9) //=> 4,5,5,3,1,8,9
但是,我只关心Math.round( Math.random() * (maximum - minimum) + minimum );
我们似乎是在Math对象中调用Math对象......
这真的很重要吗?我仍然认为如果我可以做这样的事情会感觉更好:
self.round( self.random() * (maximum - minimum) + minimum );
但是,以上是伪代码,不起作用。我怎样才能让它发挥作用?
更新
或者,当它是MathClassExtensions对象的一部分时,是否会对randomNumber属性进行求值,因此使用self或等效函数将完全没有意义?
答案 0 :(得分:0)
据我记忆,Javascript使用的是此而非自我。无论如何,由于这些方法是静态的,我认为这段代码没有问题
答案 1 :(得分:0)
虽然您可以使用this
:
var MathClassExtensions = {
randomNumber: function(minimum, maximum){
return this.round( this.random() * (maximum - minimum) + minimum );
}
};
我会建议不要这样做。问题是您现在已经将可重用函数绑定到单个执行上下文。使用单个参数的功能来演示问题更容易,尽管它仍然存在于您的版本中:
var MathClassExtensions = {
rand1: function(maximum){
return Math.round(Math.random() * maximum);
},
rand2: function(maximum){
return this.round(this.random() * maximum);
}
};
$.extend(Math, MathClassExtensions);
Math.rand1(100); //=> 64 (for example)
Math.rand2(1000); //=> 357 (for example)
到目前为止,这么好。但是,如果我们使用Math.rand1
/ Math.rand2
作为普通函数而不是Math
的静态方法呢?
[10, 50, 200].map(Math.rand1); //=> [10, 44, 157] (for example)
[10, 50, 200].map(Math.rand2); //=> TypeError: undefined is not a function
麻烦的是,以这种方式运行函数Math.rand2
只是一个函数,不依赖于Math
对象。当它被调用时,this
是当前上下文(可能是全局[窗口?]上下文),并且没有round
或random
函数。但由于Math.rand1
没有使用this
,因此效果很好。