什么';销毁javascript函数的正确方法是什么?
我不太熟悉面向对象的Javascript,但假设我有一个实例化的函数 这是正确的术语吗 该函数包含一个带有附加事件侦听器的什么';销毁javascript函数的正确方法是什么?,javascript,Javascript,我不太熟悉面向对象的Javascript,但假设我有一个实例化的函数 这是正确的术语吗 该函数包含一个带有附加事件侦听器的XMLHttpRequest,如何正确处理该函数 function foo() { var self = this; self.message = "received response"; self.url = 'someUrl'; self.req = new XMLHttpRequest(); self.req.open("POST
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
不再存在,因此它的事件也不再存在,但情况显然不是这样的是的,JavaScript函数是对象,因此它们被实例化。函数声明在输入作用域时创建函数,函数表达式在求值时创建函数
但是,在JavaScript中,您不处理对象。您只需让它们超出范围(删除对它们的所有引用),垃圾收集器就会处理它们。例如,当您
foo.req.abort()
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();
代码中没有定义“self”符号。只需让它超出范围-您可以将其设置为其他值。@很抱歉,editedI不明白为什么foo
应该是构造函数。只需将其设置为“正常”函数,不要使用这个/self
。真正的程序员使用磁针和稳定的手…我认为OP指的是var foo=new foo()代码>当他说“实例化”时。@FelixKling:哦-嗯-但是这个问题没有多大意义?不确定OP想要做什么。@Bergi我不明白的是为什么console.log(self.message)当self
设置为null
时,代码>甚至会发生?self.req.onload
怎么可能仍然存在?@andrewself.req.onload
不存在,但是它创建的回调确实存在。foo
对象、XMLHttpRequest
对象和处理函数彼此独立存在。通过设置self=null
,您刚刚销毁了self
变量,使得无法通过该范围内的self
访问foo
对象。如果没有将调用new Foo()
的结果分配给Foo
,则设置self=null
将(隐式地)“销毁”对象(包括其消息
,url
,req
属性),并使其可用于垃圾收集。请求对象将仍然存在,只是无法通过self.req
访问它。