在javascript中,在函数名被指向其他地方之后,是否有任何方法可以访问该未命名的函数
In javascript, after a function name has been pointed somewhere else, is there any way to get to that unnamed function?
所以我理解函数名称只是指向实际函数的指针。
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)
请注意下面的代码。它将对x
、y
和z
的引用替换为String对象的实例。这意味着对"potato"
将有4个引用,对x
、y
和z
将有0个引用。
var potato = "potato";
x = potato:
y = potato;
z = potato;
当JavaScript对象有0个引用时,它将被垃圾收集器清理。
参考
- Mozilla开发者网络-功能
- Mozilla开发者网络-内存管理
- 如何确保函数/方法参数为certian类型
- Javascript中对象中的函数方法
- Object.assign(),函数方法和内存使用
- 我应该在原型上还是在新创建的实例上调用构造函数方法
- Angular promise回调不是在构造函数方法内部触发,而是在对象文本方法中触发
- 如何使用 Karma、Jasmine 和 Istanbul 指定测试应涵盖哪些函数/方法
- 在ES2015中定义一个类,构造函数方法是什么以及为什么它是必不可少的
- 如何调用通过它传递不同 ID 的函数方法
- Sencha ExtJs 为什么从“构造函数”方法返回“this”
- 这个 JavaScript 函数方法调用了什么
- 如何在 javascript 中从子原型调用父类的构造函数方法
- 是否仍可访问被覆盖的函数/方法
- 在构造函数之外更改 JavaScript 中的构造函数方法
- 这种实例化构造函数方法的风格是什么
- 如何在 JavaScript 中使用继承与构造函数方法一起使用 返回具有私有属性的对象文本
- 我的javascript构造函数方法以文本形式返回整个方法,而不是预期的返回值
- 如何在事件中将变量传递给构造函数方法
- 如何限制用户在ui ace编辑器中只能编写一个javascript函数(方法)
- 打印任何java应用程序的函数/方法调用序列
- 如何在jQuery语句中使用Javascript构造函数方法