在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”指向其他地方,它仍然无法访问。