【问题标题】:RequireJS setting Module variables from outside doesnt take effectRequireJS从外部设置模块变量不生效
【发布时间】:2012-10-04 02:29:14
【问题描述】:

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

这是定义的模块:

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 

似乎仅通过执行 variable = blah 在模块中设置变量没有任何效果,似乎需要在模块的方法中设置变量。谁能向我解释这是为什么?还是我写错了什么?

提前致谢

【问题讨论】:

    标签: javascript requirejs js-amd module-pattern


    【解决方案1】:

    据我所知,对 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 () { ... },就像在您的代码中一样。

    【讨论】:

    • 嗨,马特,感谢您的回复。我已将定义功能更改为您建议的布局,但没有任何区别。所以我想知道这是否与 RequireJS AMD 风格有关。还有其他想法吗?
    • 您将代码更改为使用foo?这只是一个说明为什么它不起作用的例子,而不是解决问题。解决方法是在部分 sn-ps 中使用this.testerString
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 2014-01-20
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多