我正在尝试学习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让我发疯。
答案 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}