在dojo模块中访问javascript变量

在dojo模块中访问javascript变量,javascript,dojo,Javascript,Dojo,我正在用dojo创建一个模块。本模块是关于配置的 define(["geometry/Point"], function (Point) { var sp = new Point(122, -142); return { startPoint: new Point(122, -142), globalOptions: { logo: false,

我正在用dojo创建一个模块。本模块是关于配置的

define(["geometry/Point"], function (Point) {
        var sp = new Point(122, -142);
        return {            
            startPoint: new Point(122, -142),
            globalOptions: {
                logo: false,
                center: sp
            },

        };
    })
在本模块中,如果我使用sp变量作为中心,则代码正常工作。但是如果我使用中心作为起点,中心将为空。像下面

define(["geometry/Point"], function (Point) {
        return {            
            startPoint: new Point(122, -142),
            globalOptions: {
                logo: false,
                center: this.startPoint
            },

        };
    })

我删除了变量sp,并使用了this.startPoint,但中心为空。

这是因为引用了错误的对象。如果在
中心使用
属性,则实际上不再引用模块。因为您正在实例化一个新对象,它实际上将引用全局对象,即(如果您使用浏览器)
窗口

第一个解决方案之所以有效,是因为
sp
的作用域是可以从模块以及
globalOptions
属性访问的


编辑(根据评论要求):

要声明模块以访问其功能,应使用:

define([“dojo/\u base/declare”、“dojo/\u base/lang”、“dojo/\u base/array”]),函数(declare、lang、array){
返回declare(null{
参数:[“a”、“b”、“c”],
行动:功能(){
this.otherAction();//调用其他操作
},
其他操作:函数(){
array.forEach(this.param,lang.hitch(this,“lastFunction”);
},
lastFunction:函数(项,idx){
console.log(idx+“”+项);
}
});
});
这个例子展示了Dojo中的一些基础知识。要创建模块,应使用
dojo/\u base/declare
。第一个参数
null
用于定义继承模块的列表,在本例中为none

参数和函数可以用类似的方式声明。从另一个函数调用函数时,应提供上下文
this
,例如
this.otherAction()

如果您丢失了
上下文,可以使用
lang.hitch()
。它实际上调用函数,但保留上下文。这就是我对lang.hitch(这个“lastFunction”)所做的。


我可以解释得更多,但我认为阅读会很有用。

那是因为你引用了错误的对象。如果在
中心使用
属性,则实际上不再引用模块。因为您正在实例化一个新对象,它实际上将引用全局对象,即(如果您使用浏览器)
窗口

第一个解决方案之所以有效,是因为
sp
的作用域是可以从模块以及
globalOptions
属性访问的


编辑(根据评论要求):

要声明模块以访问其功能,应使用:

define([“dojo/\u base/declare”、“dojo/\u base/lang”、“dojo/\u base/array”]),函数(declare、lang、array){
返回declare(null{
参数:[“a”、“b”、“c”],
行动:功能(){
this.otherAction();//调用其他操作
},
其他操作:函数(){
array.forEach(this.param,lang.hitch(this,“lastFunction”);
},
lastFunction:函数(项,idx){
console.log(idx+“”+项);
}
});
});
这个例子展示了Dojo中的一些基础知识。要创建模块,应使用
dojo/\u base/declare
。第一个参数
null
用于定义继承模块的列表,在本例中为none

参数和函数可以用类似的方式声明。从另一个函数调用函数时,应提供上下文
this
,例如
this.otherAction()

如果您丢失了
上下文,可以使用
lang.hitch()
。它实际上调用函数,但保留上下文。这就是我对lang.hitch(这个“lastFunction”)所做的。


我可以解释得更多,但我认为阅读会很有用。

您的第一种方法是正确的,但是您有一点重复,这在
起点定义中是不需要的:

function test() {

    var startPoint = "x,y"

    return {            
        startPoint: startPoint,            
        globalOptions: {
            logo: false,
            center: startPoint
        }
    };
}

console.log(test().startPoint)
console.log(test().globalOptions)

在JSBIN中测试:

您的第一种方法是正确的,但是您有一点重复,这在
startPoint
定义中是不需要的:

function test() {

    var startPoint = "x,y"

    return {            
        startPoint: startPoint,            
        globalOptions: {
            logo: false,
            center: startPoint
        }
    };
}

console.log(test().startPoint)
console.log(test().globalOptions)

JSBIN中的测试:

您是否正在尝试这样做

define(["geometry/Point"], function (Point) {
        return {            
            startPoint: new Point(122, -142),
            globalOptions: {},

            postCreate: function () {
            this.globalOptions = {
            logo: false,
            center: this.startPoint
            }

          }    
        };
    })
发生此问题的原因是此


希望这对你有帮助。

你想做这样的事吗

define(["geometry/Point"], function (Point) {
        return {            
            startPoint: new Point(122, -142),
            globalOptions: {},

            postCreate: function () {
            this.globalOptions = {
            logo: false,
            center: this.startPoint
            }

          }    
        };
    })
发生此问题的原因是此


希望这将对您有所帮助。

模块

这里需要注意的两个关键概念是define方法的思想,用于简化模块定义,以及require方法,用于处理依赖项加载。“定义”用于基于使用以下签名的提案定义命名或未命名模块:

    define(
    module_id /*optional*/,
    [dependencies] /*optional*/,
    definition function /*function for instantiating the module or object*/
    );
从内联注释可以看出,module_id是一个可选参数,通常只有在使用非AMD连接工具时才需要它(在其他一些边缘情况下,它也很有用)。当忽略此参数时,我们将该模块称为匿名模块

在使用匿名模块时,模块标识的概念是枯燥的,这使得避免文件名和代码重复变得微不足道。由于代码更具可移植性,因此可以轻松地将其移动到其他位置(或文件系统周围),而无需更改代码本身或更改其ID。模块ID相当于简单软件包中的文件夹路径,并且不在软件包中使用。开发人员也可以在多个环境中运行相同的代码,只需使用AMD优化器,该优化器与r.js等公共js环境配合使用

回到define签名,dependencies参数表示您正在定义的模块和第三个参数('definition function')i所需的依赖项数组