我有下面的代码片段:

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;
    }
}


请有人对此问题有所了解。

最佳答案

您已经失去上下文。在放置this.getPosition()的位置,它将作为窗口对象返回。

如果您更改行以读取

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


它将成功运行。

或者,您可以将运行功能更改为读取

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
},

10-04 14:01