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

在javascript中,在函数名被指向其他地方之后,是否有任何方法可以访问该未命名函数?,javascript,function,Javascript,Function,所以我知道函数名只是指向实际函数的指针 function justAPointer() { //do something } 我可以更改指针名称: justAPointer = 'oops'; 现在这个函数仍然存在,但是还有什么方法可以达到它吗?只有当有东西引用它时,这个函数才仍然存在。否则它就是要收集的垃圾,就像您的代码可能分配的其他任何东西一样 如果创建对象,请执行以下操作: var obj = { hello: "world" }; 然后将“obj”重新分配给其他对象: obj =

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

function justAPointer() { //do something }
我可以更改指针名称:

justAPointer = 'oops';

现在这个函数仍然存在,但是还有什么方法可以达到它吗?

只有当有东西引用它时,这个函数才仍然存在。否则它就是要收集的垃圾,就像您的代码可能分配的其他任何东西一样

如果创建对象,请执行以下操作:

var obj = { hello: "world" };
然后将“obj”重新分配给其他对象:

obj = 22;
那么这个对象同样是垃圾。当然,同样,如果复制了参考文献,它仍然存在:

var obj = { hello: "world" };
var copy = obj;
obj = 22;
很明显,“复制”指的是静止的物体。功能真的没有什么不同


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

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

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

现在这个功能仍然存在

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

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

var foo = function(){...}

var bar = foo;

foo = "new value";

bar() //runs the original foo

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

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

//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
的引用替换为字符串对象的实例。这意味着将有4个对
“马铃薯”
的引用,0个对
x
y
z
的引用

var potato = "potato";
x = potato:
y = potato;
z = potato;
当JavaScript对象有0个引用时,垃圾收集器将清除该对象


参考资料


事实上,这并不完全正确。如果我把它传递给
setInterval()
,它仍然存在,但是没有办法访问它。啊!这是有道理的!我在Chrome上浏览它,当我事先为它分配了其他内容时,我仍然可以看到它的功能。嗯,在扩展我的答案时,我似乎一直落后你30秒。我的答案可能有点晚了。至少,我希望它完成了其他人所说的。:)是的,我试过了。但奇怪的是,即使在更改了foo之后,当我走到“watched”栏时,调试器(Chrome)仍然显示函数foo(){}。。。我想可能是Chrome怎么做到的,但我觉得很奇怪,因为你使用了一个命名函数表达式。当您使用
函数foo(){}
表单时,它会在内部将函数名设置为
foo
,而
var foo=function(){}
会创建一个匿名函数并将foo指向它。但是函数的内部名称与查找它无关。你需要一个外部参考。太棒了,谢谢你澄清。。。因此,即使内部名称仍然命名为“foo”,因为真正的“foo”指向其他地方,它仍然无法访问。