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() 的地方,这将作为窗口对象返回。

如果您更改该行以读取

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
},
于 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 回答