我刚刚阅读了这篇文章,解释了如何在javascript中使用apply。 javascript apply
在"借用其他方法和功能"它给出了一个计算平均分数的例子,它定义了两个控制器,gameController和appController。
var gameController = {
scores : [20,34,55,46,77],
avgScore:null,
players: [
{name:'Tommy',playerID:987,age:23},
{name:'Paul',playerID:87,age:33}
]
}
var appController = {
scores:[900,845,809,950],
avgScore:null,
avg:function(){
var sumOfScores = this.scores.reduce(function(prev,cur,index,array){
return prev + cur
})
this.avgScore = sumOfScores / this.scores.length
}
}
appController.avg.apply(gameController)
console.log(gameController.avgScore)
使用this关键字定义avg函数,因此使用apply通过传递控制器来重新定义范围,我理解其含义,并且知道如何从其他库中借用方法。
我问自己是否可以用更熟悉的方式编写avg函数",所以这里是我要比较的代码:
var appController = {
scores:[900,845,809,950],
avgScore:null,
avg:function(arg){
var sumOfScores = arg.scores.reduce(function(prev,cur,index,array){
return prev + cur
})
return arg.avgScore = sumOfScores / arg.scores.length
}
}
console.log(appController.avg(gameController))
我有相同的结果,为什么你要用this关键字编写函数?有什么好处?
答案 0 :(得分:0)
使用appController.avg();
的好处是使用默认绑定到调用者
appController.avg( appController );
将其与具有显式参数
的版本进行比较controllerService.avg( appController );
这看起来很糟糕,反对面向对象设计的良好实践,其中对象具有明确定义的职责和方法具有可理解的签名。
另一方面,在其他地方使用这种方法并通过控制器就可以了:
left join
答案 1 :(得分:0)
与许多编程语言一样,有很多方法可以解决javascript中的问题。除了面向对象之外,使用this
没有什么特别的好处。
在面向对象的代码中,this
是方法的上下文,该方法是与方法中实现的行为相关联的主要对象。
在ES7中提出了一种可以说更优雅的方法bind operator。