【发布时间】:2013-12-11 05:39:56
【问题描述】:
我一直在努力使用 .bind() 方法和变量“self = this”来使用这些“this”。在得到两个不同的结果时,我错过了一个概念。案例如下:
// Defining a callback class to use after retrieving data
var Callback = (function(){
// UPDATED!! Local vbles
var template_to_use, html_element, self;
function Callback(){
self = this,
template_to_use = null,
html_element = null;
}
var p = Callback.prototype;
p.set_template = function(template_funct){
self.template_to_use = template_funct;
};
p.set_html_element = function(html_element){
self.html_element = html_element;
};
p.use_callback = function(data){
$(self.html_element).append(self.template_to_use(data));
};
return Callback;
})();
这个函数的用法如下:
// Setup callback 1 to call after getting the data
var callback_1 = new Callback();
callback_1.set_template(use_templ_1);
callback_1.set_html_element("#list");
// Get list data
api_list.get_data(callback_1.use_callback);
// Setup callback 2 to call after getting more data
var callback_2 = new Callback();
callback_2.set_template(use_templ_2);
callback_2.set_html_element("#object");
// Get object data
api_object.get_data(callback_2.use_callback);
执行了两个 ajax 调用,一旦 get_data() 函数完成,它们将调用我传递给它们的回调函数。我遇到的问题是,在执行这些函数后,回调总是提到 html_element = "#object" 和相应的模板 "use_templ_2"。
如果我使用“this”和 .bind 函数而不是“self”vble,结果是预期的。
// Get object data
api_object.get_data(callback_2.use_callback.bind(callback_2));
我错过了什么?这可能是一个错误概念,因为即使我不是 js 新手,我也是对语言本身的新理解。
【问题讨论】:
-
您没有将
self变量定义为局部变量,因此两个函数都使用 same 全局变量。 -
首先,不要使用 .bind() ,除非你必须使用非常旧的 jQuery 版本。 on() 现在是首选方法。
-
@Juhana:
var好像不见了,除了最后一个之外,所有的都有逗号。 -
@trysis:这是 JavaScript 原生的
bind()函数,用于在函数中永久设置this的值,而不是弃用的用于添加事件的 jQuerybind()函数。 -
@Juhana 我已经更新了代码以使其成为本地代码,但我仍在访问相同的代码。实际上,我后来创建了一个检索“self vble”的方法。对我来说奇怪的是,在检查对象访问其属性时,这些值是好的,但是在咨询“自我”时,它们都包含相同的信息。我应该如何初始化self vble以避免共享相同的内容?
标签: javascript jquery