我在使用内部函数功能时遇到问题。
this.init = function () {
var size = this.ref;
var wall = this.element;
var id = this.id;
var initRef = this.init;
this.update(id, size, wall, initRef);
}
this.update = function (id, size, wall, init) {
$.get(url, "cpart=" + id + "&ref=" + size, (function (wall, size, init) {
return function (data) {
if (data) {
var response = JSON.parse(data);
size = response["psize"];
wall.append(response["msg"]);
wall.scrollTop($(document).height());
}
init();
}
})(wall, size, init));
}
我遇到的问题是第二次迭代,ajax请求中的变量是未定义的,我不确定为什么会发生这种情况。当第一次调用函数时,第二次调用函数时,变量和大小是未定义的。
提前感谢您的帮助
答案 0 :(得分:0)
我猜你的声明格式应该是这样的:
$.get(url, {cpart: id, ref: size}, (function (wall, size, init) {
// existing stuff
});
希望这会有所帮助。
答案 1 :(得分:0)
请尝试此:
this.update = function (id, size, wall, init) {
$.get(url, "cpart=" + id + "&ref=" + size, (function (self, wall, size, init) {
return function (data) {
if (data) {
var response = JSON.parse(data);
size = response["psize"];
wall.append(response["msg"]);
wall.scrollTop($(document).height());
}
init.apply(self);
}
})(this, wall, size, init));
}
由于您在没有真正指定激活对象的情况下调用init,因此可能会发生任何事情。
<强>更新强> 我现在正在更多地关注您的代码。
虽然,我并不完全确定你想要达到的目标,但这是一个修订版本:
this.update = function () {
var self = this;
$.get(url, "cpart=" + id + "&ref=" + size, function(data) {
if (data) {
var response = JSON.parse(data);
self.size = response["psize"];
self.wall.append(response["msg"]);
self.wall.scrollTop($(document).height());
}
init.call(self);
});
}
请注意,我不再将参数传递给update
,而是直接使用对象中的属性。我在self
变量中保留对象的引用,该变量可以从我们提供给$.get()
的匿名函数访问,因为它是在它周围的函数中声明的(即“更新”函数)。
更新2
你正在调用init,它调用update,这将导致再次调用init!难道你不认为应该有办法打破这种循环吗? 你将对服务器和用户的浏览器进行锤击。
如果您只是告诉我们您想要实现的目标,我认为这是最好的。
更新3
感觉我在为你做你的工作:J
// If you're writing a "class", there's got
// to be a constructor somewhere:
function YourClass(id, ref, element) {
// These need to come from somewhere...
this.id = id;
this.ref = ref;
this.element = element;
}
// Now we set your "class methods" on YourClass.prototype,
// so they can be shared among all the instances of YourClass.
// Create instances like this:
// obj = new YourClass();
YourClass.prototype.init = function() {
// You want to give these properties
// alternate names, I'll respect that.
// (notice obj.ref won't ever be updated, but obj.size will)
this.size = this.ref;
this.wall = this.element;
this.update();
}
YourClass.prototype.updateFromData = function(data) {
// I moved this code to a helper "class method" to make things more clear
if (data) {
var response = JSON.parse(data);
this.size = response["psize"];
this.wall.append(response["msg"]);
obj.wall.scrollTop($(document).height());
}
this.init();
}
YourClass.prototype.update = function() {
// Not the most elegant way of coding this,
// but it should be easier to read.
function createUpdater(obj){
return function(data){
obj.updateFromData(data);
}
}
$.get(url, "cpart=" + this.id + "&ref=" + this.size, createUpdater(this));
}
// An alternative to the above would simply be this:
// YourClass.prototype.update = function() {
// $.get(url, "cpart=" + this.id + "&ref=" + this.size, this.updateFromData.bind(this));
// }