JavaScript 变量访问错误

javascript variable access error

本文关键字:错误 访问 变量 JavaScript      更新时间:2024-02-06

我有下面的代码片段:

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

但是如果我替换_positiongetPosition()则会发生错误,因为未定义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
},
这是

设置一个全局变量_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;
}