我在尝试找出我的对象设计有什么问题时遇到了一些问题。
var comment = function(){
var textarea = null;
$(document).ready( init );
function init()
{
$('.reply').click( comment.reply_to );
this.textarea = $('.commentbox textarea');
console.log( this.textarea ); // properly shows the textarea element
console.log( textarea ); // outputs null
}
function set_text( the_text )
{
console.log( textarea ); // outputs null
console.log( this.textarea ); // outputs undefined
textarea.val( the_text );
}
return {
reply_to: function()
{
console.log( this ); // outputs the element who fired the event
set_text( 'a test text' ); // properly gets called.
}
};
}();
当文档完全加载时,会自动调用 init() 并初始化对象。我必须注意,textarea 成员正确地指向了所需的元素。 单击事件附加到“回复”按钮,因此每当用户单击它时都会调用 reply_to() 函数。
所以,这是我不明白的: * 何时使用“this”是安全的?从 reply_to() 使用它不是,因为上下文似乎设置为调用者元素。 * 为什么我可以从reply_to 调用"set_text()",但我不能访问"textarea"成员? * 我应该如何从 reply_to() 访问“textarea”成员(这是一个事件回调)?
最佳答案
由于在这些处理程序中上下文会发生变化,因此保留对所需上下文的引用是最简单的,我个人更喜欢 self
。这是另一种格式:
var comment = function(){
this.textarea = null;
var self = this;
$(document).ready( init );
function init()
{
$('.reply').click( reply_to );
self.textarea = $('.commentbox textarea');
}
function set_text( the_text )
{
self.textarea.val( the_text );
}
function reply_to() {
set_text( 'a test text' );
}
}();
You can test it here .诚然,虽然我不是真的确定您想要完成什么。您正在尝试返回 reply_to
函数,但您自己将其绑定(bind)到 init()
就绪处理程序中...因此您可以立即绑定(bind)它(如上所示),或者更改它并返回您想要在别处绑定(bind)的内容。
关于Javascript:如何从事件回调函数访问对象成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4344287/