2012-07-25 75 views
2

我有下面的代码片断:JavaScript变量访问错误

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

请人扔光这个问题。

+0

难道是因为这是一个'c_',这不是在这种情况下定义的? – YePhIcK 2012-07-25 12:04:34

+0

@YePhIcK c_被定义,它由函数的ret_参数提供。我也会添加ret_和make_cps。 – weima 2012-07-25 12:06:30

回答

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

在我的真实应用程序中,我将'pred'对象作为一个匿名对象,所以我不能使用'pred'来代替'this'。另外我真正的问题是为什么'_position'可以工作,但'getPosition()'不能。 – weima 2012-07-25 12:10:16

+0

@ weima在这种情况下,使用替代版本(在底部)。 _position工作的原因,但getPosition并不是你目前正在代码中错误地使用_position。 您目前正在设置和获取_position而不是prev中的位置变量,从而创建一个新的全局调用_position。 因此,它不关心上下文,因此您的问题不会发生。 – Doug 2012-07-25 12:13:49

+0

太好了。谢谢 :)。有用。它让我对JavaScript编程有了新的认识。 – weima 2012-07-25 12:15:36

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

谢谢。我知道了。但我没有任何名为'_position'的全局属性。你的意思是财产是自动创建的? – weima 2012-07-25 12:19:03

+0

是的,你用'_position = i;'创建它。 – 2012-07-25 12:49:02