访问javascript对象中的内部变量

时间:2012-05-24 15:30:11

标签: javascript

考虑这个错误的代码:

x = {
  y : "why",
  z : function() {
    return y + " zed";
  }
}

函数z不起作用:“ReferenceError:y未定义”。

有没有办法从函数z中访问y而不将其完全指定为x.y?

我当然可以将其重写为

x = function() {
  var self = this;
  this.y = "why";
  this.z = function() {
    return self.y + " zed";
  };
  return this;
}();

......但是天哪。

4 个答案:

答案 0 :(得分:3)

如果您使用this调用该函数,只需使用x.z()

var x = {
    y : "why",
    z : function() {
        return this.y + " zed";
    }
};

DEMO: http://jsfiddle.net/hZxVu/

答案 1 :(得分:0)

不,你需要重写它。 y是该对象的属性,如果没有该对象,则无法访问它 - 不像从闭包中访问变量(例如,重写中的self)。

当然,当您以x.z()方式调用该函数时,this keyword也将指向该对象,以便您可以将其写为

return this.y + " zed";

只要你总是在该对象的上下文中调用该函数。

答案 2 :(得分:0)

@VisioN有直截了当的答案。如果您重写代码,可能有助于可视化为什么这样做:

var x = {};
x.y = "why";
x.z = function() {return this.y + " zed"; };
alert(x.z());

这里y和z是对象的属性,但是没有函数闭包作用域。您需要“this”关键字才能访问父对象的属性。

可替换地,

var x = function () {
    var y = "why";     
    var z = function () { return y + " zed?"; };    
    return z();
};
alert(x());

这通过访问y而不使用它来演示功能范围。在x内,y已知。外面,它不是。

答案 3 :(得分:0)

使用揭示模块模式:

    var x = (function () {
        y = "why";
        z = function() {
            return y + " zed";
        };
        return {
            "y": y,
            "z": z
        };
    })();

    //now you can call:
    x.y // "why"
    x.z() // "why zed"