为什么自我在对象内部得到更新?

时间:2014-12-16 16:23:33

标签: javascript oop

我有一个对象,我创建了两个实例:

    var generalGraph = new graph(generalFunnel)
    generalGraph.draw("#conversion");

    var invoicingGraph = new graph(invoicingFunnel)
    invoicingGraph.draw("#invoicing")

这是对象(请注意,这是高度简化的,以便更容易理解)注释是控制台输出。

graph = function(funnel){
    this.funnel = funnel.conversions
    mySelf = this

    this.draw = function(selector){
        console.log(mySelf.funnel)
        //generalGraph ["Användare", "Påbörjat Onboarding", "Skapat oganisation", "Skapat användare", "Kom tillbaka", "Köpt"]
        //invoicingGraph ["Användare", "Påbörjat Onboarding", "Skapat oganisation", "Kom tillbaka", "Köpt"]
        nv.addGraph(function() {

            console.log(mySelf.funnel)
            //generalGraph ["Användare", "Påbörjat Onboarding", "Skapat oganisation", "Kom tillbaka", "Köpt"]
            //invoicingGraph ["Användare", "Påbörjat Onboarding", "Skapat oganisation", "Kom tillbaka", "Köpt"]
        });
    }

}

出于某种原因,当我generalGraph.draw时,它会使用来自invoicingFunnel的渠道。为什么?我怎么能阻止它发生呢?

1 个答案:

答案 0 :(得分:4)

mySelf是一个全局变量,您之前错过了var。因此,您的graph个实例都使用相同的mySelf值。

变化:

mySelf = this

var mySelf = this
  • 有关使用和省略var之间的差异,请参阅this question

  • 您可以使用strict mode来防止这些错误,the complicated rules会为您发现这些错误。

  • 在JavaScript中省略分号是可能的,但由于它涉及{{3}},因此被认为是非常危险的。今天通常不赞成这样做。
  • 类似地 - JS中的构造函数名称通常以大写字母开头。您的构造函数也应该使用var关键字定义。