在javascript中,在函数名被指向其他地方之后,是否有任何方法可以访问该未命名的函数

In javascript, after a function name has been pointed somewhere else, is there any way to get to that unnamed function?

本文关键字:函数 方法 任何 是否 访问 未命名 javascript 方之后 其他 之后      更新时间:2023-09-26

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

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分配的存储空间的问题。

如果没有其他引用,则不会。

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

现在该功能仍然存在

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

如果您想回收一个变量名并维护对该函数的引用,只需将其别名即可。

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)

请注意下面的代码。它将对xyz的引用替换为String对象的实例。这意味着对"potato"将有4个引用,对xyz将有0个引用。

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

当JavaScript对象有0个引用时,它将被垃圾收集器清理。


参考

  • Mozilla开发者网络-功能
  • Mozilla开发者网络-内存管理