【问题标题】:Functions don't recognize variables函数不识别变量
【发布时间】:2017-06-11 19:31:57
【问题描述】:

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

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

这是我在 codepen.上的代码

所以,解释一下我的问题:

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

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

如果有人知道问题出在哪里,也请告诉我:)

【问题讨论】:

    标签: javascript d3.js prototypejs


    【解决方案1】:

    当您说“所有变量”时,您指的是“xScale”、“yScale”……吗? 因为这些变量在配置文件函数中无法访问,实际上“var”变量仅在其当前范围内可见(在 {} 之间)。

    要访问类函数中的变量,您必须对 dataProfile 字段使用“this”关键字:

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

    现在您可以在其他函数中访问这些变量。

    在 JS 中,默认情况下“this”是一个上下文关键字,了解更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this

    “this”被所有对象函数共享,但匿名函数有自己的 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;
            }));
    

    您必须将对象的“this”保存在变量中:

    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;
            }));
    

    【讨论】:

    • 您好 Thomas,感谢您的帮助,这是我的问题。现在它识别一切。我谈到了“this.dataProfile = dataProfile;”同样,谁不想在我的功能配置文件中被识别。我仍然有一个错误,但更多的是关于 d3。在我的函数“profile(data)”中,var areaPath = self.svg.append('svg:path').datum(data).attr("class", "area").attr("d", self.area).node(); 行调用了我的构造函数中的“区域”。返回错误“this.xScale is not a function”。
    • 您的代码中是否还有其他“this.xScale”来代替 self.xScale,不是吗?
    • 嗨,Thomas,我的代码中现在没有任何“this.xScale”,除了构造函数中的那些。问题在这里确定:return this.xScale(d.distance); 当我定义“区域”时。我还更新了codepen
    • 经过更多调查,变量的值与var self = this;保持一致,并在` d3.json(this.dataProfile, function (error, rawData) {`. .
    • 初始化函数有同样的问题:this.area = d3.area().x(function (d) { return this.xScale(d.distance); })你必须创建一个变量var self = this并在x(function(d) { return self.xScale .....中使用它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    相关资源
    最近更新 更多