在javascript中应用的替代方案

Alternative to apply in javascript

本文关键字:方案 应用 javascript      更新时间:2023-09-26

我刚刚阅读了这篇文章,解释了如何在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中提出了一种可以说更优雅的方法作为绑定运算符。

相关文章: