在javascript中应用的替代方案
我刚刚读了这篇文章,解释了如何在javascript中使用apply。 在“借用其他方法和函数”一节中,它给出了计算平均分数的示例,它定义了两个控制器,gameController和appController在javascript中应用的替代方案,javascript,scope,Javascript,Scope,我刚刚读了这篇文章,解释了如何在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 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)
avg函数是用这个关键字定义的,所以使用apply通过传递控制器来重新定义作用域,我理解其含义,并且知道如何从其他库借用该方法
我问自己,is是否可以用一种更“熟悉”的方式编写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
}
}
我得到了相同的结果,那个么为什么要用这个关键字编写函数呢?有什么好处?使用
这个
的好处是,默认绑定到一个调用方
appController.avg();
使用显式参数将其与您的版本进行比较
appController.avg( appController );
这看起来很糟糕,与面向对象设计的良好实践背道而驰,在面向对象设计中,对象具有定义良好的职责,方法具有可理解的特征
另一方面,如果在其他地方使用此方法并在那里传递控制器,则可以:
controllerService.avg( appController );
与许多编程语言一样,有许多方法可以解决javascript中的问题。使用
这个
除了更加面向对象之外,没有什么特别的好处
在面向对象代码中,这是方法的上下文,方法中实现的行为与之关联的主要对象
ES7中提出了一种可以说更优雅的方法。调用
、应用
和绑定
是在您想要更改执行上下文、向函数传递参数等时非常有用的方法,但是给定的示例在使用this
关键字时并没有什么好处,这只是一个示例,说明了如何使用apply
更改“thisValue”。对不起,您是否说过,如果我编写一组函数,其目的是用作“库”,那么我的方法是可以接受的,但如果我“动态”编写一个函数,使用apply更好?@YvonHuynh:这只是你编程风格的问题。代码在风格上可能更差,也可能更好,但其行为方式可能完全相同。你所说的“动态”是什么意思?“动态”我指的是在我需要的时候快速而肮脏地编写一个函数,而不是构建一个体系结构的代码库,希望这能让它更清楚..我不会为了使用apply而使用apply,如果我能用一个更简单的方法,我会用那个更简单的方法。如果使用apply帮助我成为一个更好的程序员,那么我会去做。谢谢你的链接。
controllerService.avg( appController );