Javascript 需要一些帮助来理解JS模块模式的基础知识吗
我试图使用显示模块模式组织代码。 关于如何设置setter方法,我有一个非常基本的问题Javascript 需要一些帮助来理解JS模块模式的基础知识吗,javascript,jquery,module,closures,Javascript,Jquery,Module,Closures,我试图使用显示模块模式组织代码。 关于如何设置setter方法,我有一个非常基本的问题 $(document).ready(function() { var designs = (function() { var curRow, setCurRow = function(val) { curRow = val; }, initTable = func
$(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,而是获得了
未定义的
!我觉得我在做一些很愚蠢的事情。问题是setCurRow
在designs之后设置变量curRow
的值。curRow
已经设置好了。考虑这样的事情:
var a = 1;
b = a; // sets b = a = 1
b = 2; // sets b = 2; leaves a = 1
您的代码也在做同样的事情,但是使用了对象属性和setter方法使其看起来很复杂。:-) 问题在于
setCurRow
在designs之后设置变量curRow
的值。curRow
已经设置。考虑这样的事情:
var a = 1;
b = a; // sets b = a = 1
b = 2; // sets b = 2; leaves a = 1
您的代码也在做同样的事情,但是使用了对象属性和setter方法使其看起来很复杂。:-) 看起来您想要的是对象,而不是模块:
$(document).ready(function() {
var designs = {
setCurRow: function(val) {
this.curRow = val;
},
initTable: function() {
this.setCurRow(0);
},
curRow: 0
};
designs.initTable();
designs.setCurRow(someNewVal);
console.log(designs.curRow);
});
看起来您想要的是对象,而不是模块:
$(document).ready(function() {
var designs = {
setCurRow: function(val) {
this.curRow = val;
},
initTable: function() {
this.setCurRow(0);
},
curRow: 0
};
designs.initTable();
designs.setCurRow(someNewVal);
console.log(designs.curRow);
});
正如ruakh指出的,您永远不会对返回的对象重新分配
curRow
,因此它始终是默认值。将其更改为:
setCurRow = function(val) {
this.curRow = curRow = val;
},
一切都应该正常
*
至少大部分-如果不先将其绑定到对象(设计
),您将无法在setCurRow
上使用调用
和应用
(或将其传递到setTimeout
或setInterval
),因为此在JavaScript中是在调用时绑定的。正如ruakh指出的,您永远不会对返回的对象重新分配curRow
,因此它始终是默认值。将其更改为:
setCurRow = function(val) {
this.curRow = curRow = val;
},
一切都应该正常
*
至少大部分-如果不先将其绑定到对象(设计
),您将无法在setCurRow
上使用调用
和应用
(或将其传递到setTimeout
或setInterval
),因为这个在JavaScript中是在调用时绑定的。您也可以通过了解所涉及的变量和函数的范围,以另一种方式解决这个问题
当您返回对象构造函数{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());
由于getCurRow
和setCurRow
是在包含变量varRow
的作用域中关闭的函数,因此它们可以返回到该作用域,并访问和更改仅在该作用域中可访问的变量
在这种情况下,使
curRow
成为您返回的对象的成员可能更简单,但另一种方法也很有用,因为您可以使用它有效地创建对象。您还可以通过了解所涉及的变量和函数的范围,以另一种方法解决此问题
当您返回对象构造函数{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());
由于getCurRow
和setCurRow
是在包含变量varRow
的作用域中关闭的函数,因此它们可以返回到该作用域,并访问和更改仅在该作用域中可访问的变量
在这种情况下,使
curRow
成为您返回的对象的成员可能更简单,但另一种方法也很有用,因为您可以使用它来有效地创建。那么我如何更改代码以更改curRow的值呢?那么我如何更改代码以更改curRow的值呢?您得到未定义的>,因为你没有定义someNewVal
。没有。你得到了未定义的,因为你没有定义someNewVal
。没有。好的!非常感谢这正是我想要的答案。好的!非常感谢这正是我想要的答案。