Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';销毁javascript函数的正确方法是什么?_Javascript - Fatal编程技术网

什么';销毁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

我不太熟悉面向对象的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
不再存在,因此它的事件也不再存在,但情况显然不是这样的

是的,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
怎么可能仍然存在?@andrew
self.req.onload
不存在,但是它创建的回调确实存在。
foo
对象、
XMLHttpRequest
对象和处理函数彼此独立存在。通过设置
self=null
,您刚刚销毁了
self
变量,使得无法通过该范围内的
self
访问
foo
对象。如果没有将调用
new Foo()
的结果分配给
Foo
,则设置
self=null
将(隐式地)“销毁”对象(包括其
消息
url
req
属性),并使其可用于垃圾收集。请求对象将仍然存在,只是无法通过
self.req
访问它。