在javascript中应用的替代方案

在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}

我刚刚读了这篇文章,解释了如何在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)
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 );