功能无法识别变量

时间:2017-01-26 10:37:52

标签: javascript d3.js prototypejs

几天前,当我想用​​JavaScript创建一个类时,我发现了prototypejs。 我有一些完美的功能,绘制如下的配置文件: My Race Profile

要使用任何数据创建此配置文件,我想创建一个完整的类。

以下是 codepen.

上的代码

所以,解释我的问题:

我在构造函数中声明了我的变量。 当我使用var rp = new RaceProfile('data.json', 'markers.json');时,我没有任何问题。我的所有变量都是用好的值创建的。

但是,当我使用" rp.profile(data);",之前声明的所有变量都是未定义的。似乎之前定义的所有值都被删除了。而且我的代码因此无法工作。

如果有人知道问题的来源,请告诉我:)

1 个答案:

答案 0 :(得分:0)

当你说"所有变量"时,你在谈论" xScale"," yScale" ......? 因为这些变量不能在轮廓函数中达到,实际上" var"变量仅在其当前范围内可见(在{}之间)。

要在类功能中访问变量,你必须使用"这个"像dataProfile字段的关键字:

var RaceProfile = Class.create({
initialize: function (dataProfile, dataCP) {
    this.dataProfile = dataProfile;
    this.dataCP = dataCP;
    this.xScale = d3.scaleLinear();
}

现在您可以在其他功能中访问这些变量。

更多信息在JS中,默认情况下#34;这个"是一个上下文关键字,可以了解有关它的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this

"这"是通过所有对象函数共享,但匿名函数有自己的(匿名函数不附加到您的对象)。

这样无法正常工作,您无法直接访问xScale:

profile: function (rawData) {
    d3.json(this.dataProfile, function (error, rawData) {
        // ..
        this.xScale.range([0, width]).domain(d3.extent(data, function (d) {
            return d.distance;
        }));

你必须保存"这个"您的对象在变量中的作用:

profile: function (rawData) {
    var self = this;

    d3.json(this.dataProfile, function (error, rawData) {
        // ..
        self.xScale.range([0, width]).domain(d3.extent(data, function (d) {
            return d.distance;
        }));
相关问题