所以我知道函数名称只是指向实际函数的指针。
function justAPointer() { //do something }
我可以更改该指针名称:
justAPointer = 'oops';
现在该功能仍然存在,但有什么办法仍然可以达到吗?
所以我知道函数名称只是指向实际函数的指针。
function justAPointer() { //do something }
我可以更改该指针名称:
justAPointer = 'oops';
现在该功能仍然存在,但有什么办法仍然可以达到吗?
只有当有东西引用它时,该功能才仍然存在。否则它会被收集起来,就像你的代码可能分配的任何其他东西一样。
如果你创建一个对象:
var obj = { hello: "world" };
然后将“obj”重新分配给其他东西:
obj = 22;
那么那个对象同样是垃圾。当然,同样,如果制作了参考的副本,它仍然存在:
var obj = { hello: "world" };
var copy = obj;
obj = 22;
那么显然“复制”仍然指的是对象。功能真的没有什么不同。
编辑— SLaks 在评论中指出,有一些方法可以将对函数的引用存放在某些地方,以确保对象(或函数)的持续“活跃性”,甚至尽管失去了对对象(或函数)的访问。一个例子是setTimeout()
函数。传递给该 API 的函数对象将保持活动状态,直到计时器关闭,但如果您的代码没有保留到该函数的其他链接,则无法从运行时系统中取回引用。可能与 DOM 元素相关联的对象存在(或曾经存在)类似的情况。这导致(并且可能仍然导致;我非常规避风险)问题,因为某些浏览器中的 DOM 垃圾收集器(猜测)不知道如何释放 JavaScript 分配的存储空间。
如果没有其他参考,则不会。
事实上,如果它没有其他引用并且它的状态没有被使用(即它不是一个闭包函数),这个语句
现在该功能仍然存在
不一定有效。该函数可能会被垃圾收集并从内存中删除。
如果要回收变量名并维护对该函数的引用,只需为其设置别名即可。
var foo = function(){...}
var bar = foo;
foo = "new value";
bar() //runs the original foo
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
,y
和z
String 对象实例的引用。这意味着将有 4 个引用"potato"
和 0 个引用x
,y
和z
。
var potato = "potato";
x = potato:
y = potato;
z = potato;
当一个 JavaScript 对象对它的引用为 0 时,它会被垃圾收集器清理掉。
参考