我正在学习如何将不同的功能分成不同的部分,以便我可以松散耦合。我有两个对象1.'addition'和2.'减法'。我不认为这个Q的信息很重要。我想要做的是当index.html文件中的amount = 3时,应该将金额传递给addition.getAmount(amount)。 In是one.js我尝试返回该金额function getAmount (amount){
return amount;
}
我调用该函数并将其分配给addAmount
var addAmount = getAmount();
。然后我返回一个名为returnAmount
的属性的对象,该属性的值为addAmount
,它应该具有getAmount()的返回值,在这种情况下应为3。
Index.html代码段
<script src ="http://code.jquery.com/jquery-2.1.1.js"></script>
<script >
var clicked = "addition";
var amount = 3;
//var returned = true
</script>
<script src="one.js"></script>
<script src = "two.js"></script>
<script type="text/javascript">
if(clicked == "addition"){
addition.method()
addition.getAmount(amount)
console.log(addition.returnAmount) //should output 3
}
if(clicked == "subtraction"){
subtraction.method()
}
console.log(addition.isaddition)
</script>
</head>
<body>
one.js
var addition = (function(){
var addAmount = getAmount();
function getAmount (amount){
return amount;
}
return {
method : function(){
console.log("test form addition")
},
getAmount : getAmount,
// this property should return 3
returnAmount : addAmount,
isaddition : true
}
})()
console.log(addition.returnAmount);
并没有给我输出3它给我未定义我希望它输出3
答案 0 :(得分:0)
当你的模块第一次被执行时(例如,当你首先解析脚本时),addAmount
被赋予了getAmount()
的返回值,当你没有传入一个参数时,它是undefined
。现在,当您从模块返回对象并将returnAmount
分配给addAmount
时,您将returnAmount
设置为undefined
,并且始终为{ {1}}。
如果您正在访问的模块变量是动态更新的,则不能使用直接访问器属性来获取它,必须使用方法。
修改强>
我不太确定你要做什么,所以这可能会或可能不会相关,但我会假设你正试图模仿私人会员。 JS:
undefined
编辑#2
如果必须从模块模式执行此操作:
var addition = (function() {
//private variable
var amt;
//private method
function getAmount(amount) {
//assign private variable "amt" to be the value of "amount"
amt = amount;
return amt;
}
//public methods
return {
method: function() {
console.log("test form addition")
},
//expose private method "getAmount" via public method "getAmount"
getAmount: getAmount,
//expose private variable "amt" via public method "returnAmount"
returnAmount: function() {
return amt;
},
isaddition: true
}
}());
addition.getAmount(10);
addition.returnAmount(); //returns 10
然后return {
...
amt:amt
...
}
将是您的模块执行时分配给amt
的值,它永远不会更新。有一个小警告,对象/数组是通过引用而不是值来处理的,所以如果你的模块中有这样的东西:
amt
并修改(例如var amt = [];
return {
amt:amt
}
,push
,pop
等)splice
数组(但不创建新数组)然后您的修改将出现在任何地方引用amt
的地方(只要您不覆盖 amt
,但这是另一个问题。