我正在尝试使用显示模块模式来组织我的代码。
关于如何设置setter方法,我有一个非常基本的问题。

$(document).ready(function() {
    var designs = (function() {
        var curRow,
            setCurRow = function(val) {
                curRow = val;
            },
            initTable = function() {
                setCurRow(0);
            };
        return {
            curRow : curRow,
            setCurRow : setCurRow,
            initTable : initTable
        }
    }) ();
    designs.initTable();
    designs.setCurRow(someNewVal);
    console.log(designs.curRow);
});


问题是我在控制台输出中没有得到someNewVal,而是得到了undefined!我有一种感觉,我在这里做着一些愚蠢的事情。

最佳答案

您还可以通过了解所涉及的变量和函数的范围以另一种方式解决此问题。

当您返回对象构造函数{ curRow: curRow ... }时,它只是将名为curRow的对象成员初始化为匿名函数范围内的变量curRow的值。它们之间不会建立任何持久的连接。

匿名函数返回后,调用designs.setCurRow会完全按照您的期望更新该范围内的curRow变量,但是该变量现在对于外界完全不可访问-它与curRow成员之间没有任何联系。设计。

您可以通过使setCurRow方法在this.curRow上运行来解决此问题,就像在其他解决方案中一样。在这种情况下,您不必在原始范围内将curRow设置为变量,因为它完全没有使用。另一种解决方案是在您当前的方法中添加“ getter”方法:

var designs = (function() {
    var curRow,
    setCurRow = function(val) {
        curRow = val;
    },
    getCurRow = function() {
        return curRow;
    },
    initTable = function() {
        setCurRow(0);
    };
    return {
        getCurRow : getCurRow,
        setCurRow : setCurRow,
        initTable : initTable
    };
}) ();
designs.initTable();
designs.setCurRow(someNewVal);
console.log(designs.getCurRow());


因为getCurRowsetCurRow是在包含变量varRow的作用域中关闭的函数,所以它们可以返回该作用域并访问和更改仅可在其中访问的变量。

在这种情况下,使curRow成为返回对象的成员可能更简单,但是另一种方法也很有用,因为您可以使用它来有效地创建private members and methods

10-05 20:28