有人可以解释为什么以下不起作用:
function displayResults(data) { $("#odNextPage").click(function() { alert(data.queryType); // "undefined" return false; }); }
为什么我可以在单击匿名函数中使用数据对象?
编辑:queryType属性实际上没有设置我认为导致问题,抱歉.考虑到click函数是在数据对象范围之外执行的,我仍然有兴趣解释为什么它现在可以工作.
解决方法
调用displayResults的东西不仅在调用函数时控制数据,而且在它返回时(因此在调用回调之前)控制数据.调用序列可能如下所示:
data = { /* interesting things */ }; displayResults(data); delete data.queryType; // Time passes and then your callback gets called // but data.queryType is undefined.
我不知道你的情况的确切情况,但上面总结了可能发生的情况.
当你对数据产生闭包时,你会抓住数据,但这并不意味着你已经锁定了内部数据.
既然我们知道数据来自哪里以及为什么它首先被破坏了,我们就可以考虑为什么当数据正确并且不管它时它是如何工作的.
当您创建匿名回调函数时:
function() { alert(data.queryType); return false; }
你正在创建一个闭包,它保持对数据的引用(或者更准确地说,指向哪些数据),并且在没有人引用数据之前,数据不会被终止.变量的生命周期取决于其范围;您的数据变量存在于displayResults函数中.但是变量只引用(或指向)内存中的对象,并且该对象或多或少地会一直存在,直到没有人再引用它为止.
变量名称和被命名的对象是具有不同生命周期的独立实体.引用李小龙的话:
Don’t concentrate on the finger,or you will miss all the heavenly glory.
即使它们不被称为指针,你也无法摆脱编程中的指针.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。