本地范围内的JavaScript(非常菜鸟)

时间:2016-03-13 01:41:14

标签: javascript

我正在尝试学习JavaScript而且我一直坚持使用范围。

var payments = function () {
    var invoice = {};
    return {
        init: function (Obj) {
            invoice = Obj;
        },
        invoice : invoice
    };
}();

我致电payments.init({foo:bar})。然后,如果我致电payments.invoice,则会返回undefined。但是init函数应该在调用时搜索外部变量invoice。我究竟做错了什么?

我来自PHP,JavaScript中的OOP让我发疯。

3 个答案:

答案 0 :(得分:1)

问题是invoice属性是按值分配的,而不是通过引用分配的(JS没有按引用分配)。

然后,当您更改变量invoice的值时,属性invoice的值不会神奇地更新。

您可以尝试使用读取变量invoice的方法,而不是将invoice的值存储在数据属性中:

var payments = function () {
  var invoice = {};
  return {
    init: function (obj) { invoice = obj; },
    invoice: function() { return invoice; }
  }
}();
payments.init({foo: "bar"});
payments.invoice(); // {foo: "bar"}

或者使用getter属性:

var payments = function () {
  var invoice = {};
  return {
    init: function (obj) { invoice = obj; },
    get invoice() { return invoice; }
  }
}();
payments.init({foo: "bar"});
payments.invoice; // {foo: "bar"}

答案 1 :(得分:1)

这是因为返回对象的invoice属性仍然指向初始对象。您已更改invoice变量指向的对象,但未更改模块对象。

尝试这样的事情:

var payments = function () {
    var module = {
        init: function (Obj) {
            module.invoice = Obj;
        },
        invoice: null
    };
    return module;
}();

答案 2 :(得分:0)

它是这样的:

var invoice={a:1}
var payments={
    init:function(obj){
        invoice=obj;
        console.log(invoice);
    },
    invoice:invoice
};
payments.init({foo:'bar'});//{foo:'bar'}
console.log(payments.invoice)//{a:1}