JavaScript on local scopeing(非常菜鸟)

JavaScript on local scoping (very noob)

本文关键字:非常 菜鸟 scopeing on local JavaScript      更新时间:2023-09-26

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

问题是 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"}

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

尝试这样的事情:

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

是这样的:

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}