2

私は以下のコードスニペットを持っています:

var ret_ = function(x){
    return x;
}
var make_cps=function(x,c_){
    return c_(x);
}
var pred = {
    _position: 0,
    setPosition: function (i) {
        _position = i
    },
    getPosition: function () {
        return _position
    },
    _size: 0,
    setSize: function (i) {
        _size = i
    },
    getSize: function () {
        return _size
    },
    _context: null,
    setContext: function (x) {
        _context = x
    },
    run: function () {
        return function (c_) {
            return make_cps(_position, c_);
        }(ret_) == 2;
    }
}    

以下のように実行すると、正しく実行されます。

pred.setPosition(2)  
pred.setSize(10)  
pred.setContext(null)  
var res = pred.run()  
console.log(res)  // Output: true

しかし、定義されていない_positionためgetPosition()、エラーが発生します。getPosition()また、変更するthis.getPosition()this、というメンバーがいないと表示されますgetPosition()

var pred = {
    _position: 0,
    setPosition: function (i) {
        _position = i
    },
    getPosition: function () {
        return _position
    },
    _size: 0,
    setSize: function (i) {
        _size = i
    },
    getSize: function () {
        return _size
    },
    _context: null,
    setContext: function (x) {
        _context = x
    },
    run: function () {
        return function (c_) {
            return make_cps(this.getPosition(), c_); // gives Error here
        }(ret_) == 2;
    }
}    

誰かがこの問題に光を当ててください。

4

2 に答える 2

3

コンテキストが失われました。this.getPosition() を配置した場所に、これが window オブジェクトとして返されます。

読み取る行を変更すると

return make_cps(pred.getPosition(), c_);

それは正常に動作します。

または、run 関数を read に変更することもできます。

run: function () {
  var that = this;

  return function (c_) {
      return make_cps(that.getPosition(), c_);
  }(ret_) == 2;
}

編集:明確化

_position が同じ問題に悩まされるのではなく、まだ機能している理由は、現在のコードで実際に prev._position をまったく設定していないためです。

setPosition: function (i) {
    _position = i
},
getPosition: function () {
    return _position
}

そこで実際に行っていることは、_position という新しいグローバル変数を作成し、代わりにそれを使用することです。

このコードは実際には次のようになります。

setPosition: function (i) {
    this._position = i
},
getPosition: function () {
    return this._position
},
于 2012-07-25T12:06:40.767 に答える
0

これはグローバル変数を設定しています_position:

setPosition: function (i) {
    _position = i
},

predオブジェクトの変数ではありません。

ここにアクセスすると:

run: function () {
    return function (c_) {
        return make_cps(_position, c_);
    }(ret_) == 2;
}

そのグローバル変数を使用しています。

インスタンス プロパティを使用する場合は、以下を使用する必要がありますthis

setPosition: function (i) {
    this._position = i
},


run: function () {
    var pred = this;
    return function (c_) {
        return make_cps(pred._position, c_);
    }(ret_) == 2;
}
于 2012-07-25T12:15:42.883 に答える