2

所以我知道函数名称只是指向实际函数的指针。

function justAPointer() { //do something }

我可以更改该指针名称:

justAPointer = 'oops';

现在该功能仍然存在,但有什么办法仍然可以达到吗?

4

3 回答 3

6

只有当有东西引用它时,该功能才仍然存在。否则它会被收集起来,就像你的代码可能分配的任何其他东西一样。

如果你创建一个对象:

var obj = { hello: "world" };

然后将“obj”重新分配给其他东西:

obj = 22;

那么那个对象同样是垃圾。当然,同样,如果制作了参考的副本,它仍然存在:

var obj = { hello: "world" };
var copy = obj;
obj = 22;

那么显然“复制”仍然指的是对象。功能真的没有什么不同。

编辑— SLaks 在评论中指出,有一些方法可以将对函数的引用存放在某些地方,以确保对象(或函数)的持续“活跃性”,甚至尽管失去了对对象(或函数)的访问。一个例子是setTimeout()函数。传递给该 API 的函数对象将保持活动状态,直到计时器关闭,但如果您的代码没有保留到该函数的其他链接,则无法从运行时系统中取回引用。可能与 DOM 元素相关联的对象存在(或曾经存在)类似的情况。这导致(并且可能仍然导致;我非常规避风险)问题,因为某些浏览器中的 DOM 垃圾收集器(猜测)不知道如何释放 JavaScript 分配的存储空间。

于 2013-08-05T17:56:40.623 回答
2

如果没有其他参考,则不会。

事实上,如果它没有其他引用并且它的状态没有被使用(即它不是一个闭包函数),这个语句

现在该功能仍然存在

不一定有效。该函数可能会被垃圾收集并从内存中删除。

如果要回收变量名并维护对该函数的引用,只需为其设置别名即可。

var foo = function(){...}

var bar = foo;

foo = "new value";

bar() //runs the original foo
于 2013-08-05T17:58:18.037 回答
1

JavaScript 中的函数是一个对象。换句话说,通过声明一个函数,您正在创建一个 Function 对象的实例。

以下是声明函数的不同方式:

//function statement
function x (a, b) { return a + b;  }

//function expression, this will store an anonymous function into a variable
var y = function (a, b) { return a + b;  };

//Function constructor 
var z = new Function ("a", "b", "return a + b;"); // avoid this form, it will prevent certain optimizations from the browser's JS engine because of the strings (this is just an example)

请注意下面的代码。它替换了对x,yzString 对象实例的引用。这意味着将有 4 个引用"potato"和 0 个引用x,yz

var potato = "potato";
x = potato:
y = potato;
z = potato;

当一个 JavaScript 对象对它的引用为 0 时,它会被垃圾收集器清理掉。


参考

于 2013-08-05T18:23:29.690 回答