4

考虑这个错误代码:

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

函数 z 不起作用:“ReferenceError: y is not defined”。

有没有办法从函数 z 中访问 y 而无需将其完全指定为 xy?

我当然可以将其重写为

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

……但是天哪。

4

4 回答 4

3

this如果您使用以下方法调用函数,只需使用x.z()

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

演示:http: //jsfiddle.net/hZxVu/

于 2012-05-24T15:31:27.280 回答
0

不,您将需要这样重写它。y是那个对象的一个​​属性,没有这个对象你就不能访问它——不像self从一个闭包访问一个变量(例如在你的重写中)。

当然,当你调用 as 函数时x.z()this关键字也会指向对象,所以你可以写成

return this.y + " zed";

只要您始终在该对象的上下文中调用该函数。

于 2012-05-24T15:34:57.740 回答
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 而不使用它来演示功能范围。的内部xy是已知的。在外面,它不是。

于 2012-05-24T16:07:49.573 回答
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"
于 2015-03-03T17:11:31.097 回答