javascript中的变量可见性

时间:2017-04-29 17:01:23

标签: javascript

我正在努力理解如何引用变量并在Javascript中保持活力。在下面我有两种类型的对象,一个Note和一个IntervalBuilder,它接受一个Note并创建 第二个注意事项。

function Note() {
        this.key = 1 + Math.floor( Math.random() * 13); // from 1 to 13 inclusive
        this.setKey = function setKey(i) { key = i; };
        this.getKey = function getKey() { return this.key; } ;  // {return key} is a ReferenceError!!
}

function IntervalBuilder() {

    this.setPerfectFifth = function setPerfectFifth(root) {
    this.fifth = new Note();
    console.log("this.fifth: " + this.fifth);
    this.y = root.key;
    console.log("root.key: " + root.key );
    console.log("y: " + this.y );
    this.fifth.setKey( this.y + 4 );
    return this.fifth;
    };
}

有了上述内容,我现在可以这样做:

var x = new Note();
var ib = new IntervalBuilder();
ib.setPerfectFifth(x);

然而,实例ib现在有一个名为5th的成员!我希望的是我可以将setPerfectFifth的返回值(注释)分​​配给变量,让第五个消失。怎么做的?

非常感谢任何帮助,我发现很多这些令人困惑。

杰拉德

2 个答案:

答案 0 :(得分:1)

由于您在javascript 中命名了您的问题变量可见性,基本上是:在this.fifth = new Note();中,关键字this引用该实例({{1}的ib })。因此,您将新创建的注释附加到实例。在JavaScript中,只要可以从全局对象(var ib = new ...开始,当您想到图形时)到达变量时,它就不会被垃圾收集掉。

你想要的是:window,它将创建一个局部变量,一旦函数执行结束,它将被释放。显然,var fith = new Note()的每次使用都必须由this.fifth替换。

答案 1 :(得分:1)

我不知道你想要实现什么,但我认为你需要以下代码结构:

// ==============================
// NOTE "CLASS"
// ==============================

var Note = (function () {
  // Constructor
  function Note() {
    this._key = 1 + Math.floor( Math.random() * 13);
  }

  // Getter
  Note.prototype.getKey = function () {
    return this._key;
  };

  // Setter
  Note.prototype.setKey = function (i) {
    this._key = i;
  };

  return Note;
})();

// ==============================
// INTERVAL BUILDER "CLASS"
// ==============================   

var IntervalBuilder = (function () {

  // Constructor
  function IntervalBuilder() {}

  // Private members
  var fifth = null,
      y = 0;

  // Setter
  IntervalBuilder.prototype.setPerfectFifth = function (root) {
    fifth = new Note();   
    y = root.getKey();
    fifth.setKey(y + 4);
    return fifth;
  };

  return IntervalBuilder;
})();

// ==============================
// CLIENT CODE
// ==============================

var x = new Note(),
    ib = new IntervalBuilder();

ib.setPerfectFifth(x);