在javascript中应用的替代方案
Alternative to apply in javascript
我刚刚阅读了这篇文章,解释了如何在javascript中使用apply。javascript应用
在"借用其他方法和函数"一节中,它给出了一个计算平均分数的示例,它定义了两个控制器,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)
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
的好处是,通过与调用者的默认绑定,您可以获得
appController.avg();
将其与带有显式参数的版本进行比较
appController.avg( appController );
这看起来很糟糕,与面向对象设计的良好实践背道而驰,在面向对象设计中,对象有明确定义的职责,方法有可理解的签名。
另一方面,在其他地方使用这种方法并通过控制器就可以了:
controllerService.avg( appController );
在许多编程语言中,有很多方法可以解决javascript中的问题。除了更加面向对象之外,使用this
没有什么特别的好处。
在面向对象的代码中,this
是方法的上下文,是与方法中实现的行为相关联的主要对象。
ES7中提出了一种可以说更优雅的方法作为绑定运算符。
相关文章:
- Web 应用程序需要记住对象状态 - 需要解决方案建议
- 将复杂内容(想想整个网页树)从一个 Web 应用程序提供给另一个网站的最佳可重用解决方案是什么?
- iPhone应用程序或移动野生动物园的动画PNG文件的替代方案,目标是模拟短视频剪辑的即时播放
- AngularJS - Grunt:是否存在一种解决方案来构建仅包含所需模块的正在运行的应用程序
- 使用 HTML、CSS 和 JS 构建桌面应用程序的替代方案
- 在主干应用中持久更新集合模型的正确方案
- 要在不同 VS 解决方案中的多个应用中使用的自定义控件
- 数据切换和onclick不能一起工作,我太新了,无法应用@epascarello的解决方案
- 允许在 HTML5 应用程序中访问内部网/本地文件的解决方案
- 用于存储 Javascript 应用程序的持久本地数据的轻量级解决方案
- 通过Spotify应用程序API打开自定义url方案
- IE上使用的javascript应用程序的xml替代方案
- 在javascript中应用的替代方案
- CSS/Javascript解决方案,可根据图像方向自动应用高度/宽度属性
- 使用自定义方案打开应用程序-防止“;在<appname>"警告
- iOS 9.3.2自定义URL方案不能从Safari启动应用程序
- 如何在phonegap混合应用程序中检测URL方案并防止默认导航到该URL
- 如何在主干应用程序中保护不正常的互联网连接?有没有像《流星》那样的解决方案
- 需要找到一个类似于Ipad应用的JQuery解决方案
- 从同构应用程序访问导航器对象的优雅解决方案