RequireJS设置来自外部的模块变量不起作用

时间:2012-10-04 02:29:14

标签: javascript requirejs js-amd module-pattern

我在requireJS Define模块中设置变量时遇到问题,它没有生效。我有以下(缩减)示例来说明问题:

这是定义的模块:

define([], function () {
var testerString = "BaseLine";

var ShowTesterString = function () {
    console.log(testerString);
}

var setTesterString = function (pTesterString) {
    testerString = pTesterString;
}

return {
    testerString: testerString,
    ShowTesterString: ShowTesterString,
    setTesterString: setTesterString
};  
});

我设置" TesterModule"作为另一个的依赖项并运行以下代码行:

TesterModule.ShowTesterString();
TesterModule.testerString = "Change 1";
TesterModule.ShowTesterString();
TesterModule.setTesterString("Change in Setter");
TesterModule.ShowTesterString();

输出到控制台的是:

BaseLine 
BaseLine 
Change in Setter 

我原以为它应该是:

BaseLine 
Change 1
Change in Setter 

似乎只是通过执行变量= blah在模块中设置变量不会产生任何影响,似乎需要在模块的方法中设置变量。任何人都可以向我解释为什么会这样吗?或者我编码错了什么?

提前致谢

1 个答案:

答案 0 :(得分:2)

据我所知,不是非常熟悉RequireJS,这是一个纯JavaScript问题。变化

console.log(testerString);
// to
console.log(this.testerString);

并更改

testerString = pTesterString;
// to
this.testerString = pTesterString;

这样您就可以获取/设置匿名函数返回的对象中的值,而不是关闭var testerString变量。如果您使用与返回的对象键不同的变量名称,则当前代码中发生的情况可能会澄清:

define([], function () {
    var foo = "BaseLine";

    var ShowTesterString = function () {
        console.log(foo);
    }

    var setTesterString = function (pTesterString) {
        foo = pTesterString;
    }

    return {
        testerString: foo,
        ShowTesterString: ShowTesterString,
        setTesterString: setTesterString
    };  
});

另外,作为a matter of style,最好使用“普通”函数声明:

function ShowTesterString () {
    ...
}

比使用var ShowTesterString = function () { ... },而不是代码。