从函数外部访问变量并返回变量。在模块模式中

时间:2015-06-20 23:35:35

标签: javascript function module scope

我正在学习如何将不同的功能分成不同的部分,以便我可以松散耦合。我有两个对象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

1 个答案:

答案 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 } pushpop等)splice数组(但不创建新数组)然后您的修改将出现在任何地方引用amt的地方(只要您不覆盖 amt,但这是另一个问题。