名称空间为“的javascript问题”;这";还有一个图书馆

名称空间为“的javascript问题”;这";还有一个图书馆,javascript,namespaces,scope,queue,javascript-namespaces,Javascript,Namespaces,Scope,Queue,Javascript Namespaces,我正在构建一个可视化页面(带有dc.js),为此我决定进行跳转,并将其全部收集到一个名称空间中。由于Python的简单性,与JavaScript的范围疯狂相抗衡已经够艰难的了,所以请容忍我 我有一个通用的JS结构,如下所示: var NamespaceClass = function() { this.var0 = "something"; this.var1 = dc.SomeChartClass("#some-css-selector"); this.setup

我正在构建一个可视化页面(带有
dc.js
),为此我决定进行跳转,并将其全部收集到一个名称空间中。由于Python的简单性,与JavaScript的范围疯狂相抗衡已经够艰难的了,所以请容忍我

我有一个通用的JS结构,如下所示:

var NamespaceClass = function() {

    this.var0 = "something";
    this.var1 = dc.SomeChartClass("#some-css-selector");

    this.setup = function(error, config, dataset) {
        console.log("Inside setup:", this);
        this.var2 = this.process_data(dataset);
        // Do some more stuff...
    }

    this.process_data = function(data) {
        var whatever;
        //Do stuff with "data"...
        return whatever;
    }

    this.start = function() {
        console.log("Inside start:", this);
        var q;

        q = queue().defer(d3.json, "config.json")
                   .defer(d3.csv, "data.csv");
        q.await(this.setup);
    }
}

var MyNamespace = new NamespaceClass();
MyNamespace.start();
其中,
queue
用于异步文件排队。当我尝试测试脚本时,我会进入控制台:

Inside start: Object { var0 = "something", var1={...}, more...}
Inside setup: Window testpage.html
TypeError: this.process_data is not a function
因此,从
q.await
调用
setup
会使对象的作用域(或JavaScript中的任何调用)松动。我怎样才能避免这种情况?我还尝试使用代理对象,如:

    this.start = function() {
        console.log("Inside start:", this);
        var q, proxy;

        q = queue().defer(d3.json, "config.json")
                   .defer(d3.csv, "data.csv");
        proxy = this.setup;
        q.await(proxy);
    }

没用

此的值取决于您如何调用包含它的函数。您无法控制如何调用
setup
函数,因为它是在
q.await
函数中调用的

当您执行
q.await(this.setup)
时,您会传递一个对函数setup的引用,但会“丢失”与命名空间的任何连接。您需要将函数绑定到名称空间,使其具有适当的
this
值:

q.await(this.setup.bind(this));
更好的是,由于所有函数只有在
this
是名称空间时才能工作,因此您应该像这样将它们绑定到名称空间:

this.start = function() {
  // body
}.bind(this);

// usage:
q.await(this.setup);
this.start = function() {
    var namespace = this;

    q.await(function(){ namespace.setup(); });
}
现在无论你经过哪里,他们都会在里面有正确的
this

注意:在这种情况下,
bind
的工作原理如下:

this.start = function() {
  // body
}.bind(this);

// usage:
q.await(this.setup);
this.start = function() {
    var namespace = this;

    q.await(function(){ namespace.setup(); });
}

这与您的问题无关,但不需要创建一个具有名称空间的类。一个简单的对象就可以了,你可以用一个IIFE来初始化它,使你的所有变量都有作用域,这样它们就不会污染全局作用域。到目前为止,这是唯一允许我执行类间方法调用的方法(比如
This.fun1
调用
This.fun2
)。但是每次使用
这个都相当乏味。
。你能给我指出一些你建议的例子吗?这有一个例子。我试过这种方法,但它不允许我让类函数(方法)自己调用其他方法。我必须使用
.bind(namespace)
(其中
namespace
与你上一个例子相同)对于类方法内部的fluent方法(如
dc.js
)中声明的匿名函数。