我不太熟悉面向对象的Javascript,但我想说我有一个我实例化的函数?
这是正确的术语吗?
该函数包含一个带有附加事件监听器的XMLHttpRequest
,处理该函数的正确方法是什么?
function foo() {
var self = this;
self.message = "received response";
self.url = 'someUrl';
self.req = new XMLHttpRequest();
self.req.open("POST", self.url, true);
self.req.onload = function () {
console.log(self.message); // Unable to get property 'message' of
// undefined or null reference
};
self.req.send();
self = null;
}
var foo = new foo();
我意识到这不是我应该如何中止XMLHttpRequest
,而只是一个例子,问题是我应该如何干净地销毁一个函数以及它产生或创建的所有函数?
修改
要澄清,我的疑惑是self.req.onload
以及self
= null
时它是如何存在的?我的想法是self.req
不再存在,因此它的事件也是如此,但显然情况并非如此
答案 0 :(得分:4)
是的,JavaScript函数是对象,因此它们是实例化的。函数声明在输入范围时创建函数,函数表达式在计算范围时执行。
但是,在JavaScript中,您不能部署对象。你只是让它们超出范围(删除对它们的所有引用),垃圾收集器将处理它们。例如,当您foo.req.abort()
请求或响应到达且foo.req.onload
不再可访问时,您的侦听器函数将被垃圾收集。
答案 1 :(得分:1)
我会这样写你的例子:
function foo () {
var message = "received response";
var url = 'someUrl';
var req = new XMLHttpRequest();
req.open("POST", url, true);
req.onload = function () {
console.log(message);
};
req.send();
}
// No need to instantiate foo, just call it when you want to make your request
// No need for foo to "remember" variables.
foo();