微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

jQuery匿名函数变量范围

有人可以解释为什么以下不起作用:

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 举报,一经查实,本站将立刻删除。

相关推荐