javascript – 解释器如何处理全局对象中引用的本地函数?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 解释器如何处理全局对象中引用的本地函数?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1453字,纯文字阅读大概需要3分钟。
内容图文
window.onload = function() {
var a = function(x) {
console.log(x);
};
document.onclick = function() {
a(1);
};
document.onkeyup = function() {
a(2);
};
};
我很清楚为什么这有效,但不是如何.
当window.onload结束时,a被销毁,但它引用的函数仍然可用于事件处理程序,因为它是在更高的范围内声明的,如果我理解正确的话.
解释器是否在后台保留了对函数的隐藏引用,或者解释器是否以某种方式内联函数?这种类型的代码是否避免全局变量有效?谢谢.
解决方法:
解释器是否在后台保留了对函数的隐藏引用,或者解释器是否以某种方式内联函数?
对于所有javascript引擎,这都无法全局回答.但是解析器很可能必须为你在document.onclick和document.onkeyup上定义的匿名函数保留对函数a的引用.因此a不会立即被破坏,它只能通过javascript变量范围的限制来访问.
这就是闭包可能导致内存泄漏的原因,因为引擎很难实际正确解除引用. (这是IE engine的一个问题,但仍然是不小心处理).并且由于您无法手动取消引用,因为您无法访问该变量,因此此类模式不会对内存泄漏进行快速修复.
你的例子也不是closure,因为它不返回一个函数,但是它处理同一种变量范围问题,因为它引用了一个局部变量,内部函数不共享相同的范围(document.onclick和document.onkeyup) ).
我非常怀疑没有引擎会尝试内联函数a,因为这会不必要地复制函数对象.它最有可能保留为pointer,并且一旦引用计数降至0,就可以轻松销毁所提到的引用计数(在您的示例中,当解除对document.onclick和document.onkeyup的解除引用时(设置为null或undefined) .
这种类型的代码是否避免全局变量有效?
避免全局变量总是好的,所以一般来说:是的,它是避免全局变量的有效方法.每个好的引擎也应该销毁一次document.onclick和document.onkeyup被解除引用.
内容总结
以上是互联网集市为您收集整理的javascript – 解释器如何处理全局对象中引用的本地函数?全部内容,希望文章能够帮你解决javascript – 解释器如何处理全局对象中引用的本地函数?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。