替代在javascript中应用

时间:2015-12-06 16:20:29

标签: javascript scope

我刚刚阅读了这篇文章,解释了如何在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关键字编写函数?有什么好处?

2 个答案:

答案 0 :(得分:0)

使用appController.avg(); 的好处是使用默认绑定到调用者

appController.avg( appController );

将其与具有显式参数

的版本进行比较
controllerService.avg( appController );

这看起来很糟糕,反对面向对象设计的良好实践,其中对象具有明确定义的职责和方法具有可理解的签名。

另一方面,在其他地方使用这种方法并通过控制器就可以了:

left join

答案 1 :(得分:0)

与许多编程语言一样,有很多方法可以解决javascript中的问题。除了面向对象之外,使用this没有什么特别的好处。

在面向对象的代码中,this是方法的上下文,该方法是与方法中实现的行为相关联的主要对象。

在ES7中提出了一种可以说更优雅的方法bind operator