【问题标题】:Global Variables in jquery nested functions?jquery嵌套函数中的全局变量?
【发布时间】:2012-07-19 13:36:53
【问题描述】:

在 jquery 嵌套函数中可以访问全局变量吗? 我有一个我无法解决的问题。一个对象属性发生变化,而另一个对象属性不变

情况是这样的

    for(var key in object) {
        if(object[key].boolean) {
            alert(object[key].value)
            $.get(url, "data", function(data) {
                if(parseInt(data) > object[key].int) {
                    alert(object[key].value);
                    object.int = data;
                }
            });
        }
    }

我遇到的问题是 object[key].value 不保存它的值。两个警报都有不同的值,所以我不能在嵌套返回函数中使用它。 object[key].int 也得到正确更新,这更令人困惑。对象被声明为全局变量。

非常感谢任何建议。

【问题讨论】:

  • 请展示一个完整的例子来说明问题,最好是jsfiddle
  • 我认为您需要在您的第一个警报所在的位置(在 ajax 调用之前)执行 var obj = object[key]; 以使其工作。
  • 创建一个新的本地范围。使用$.each 而不是for(..){..}

标签: javascript jquery callback scope


【解决方案1】:

只有在获取成功后才会调用您的匿名包装器,它不会立即调用,看起来像一些情况

Return a function from the anonymous wrapper?

您是否从内部封闭处收到最后一项警报?

var object = {
    x:10,
    y:20,
    z:30
};
for(var key in object) {
            console.log("outside closure",object[key]);
                $.get("/echo/html?data=asdf" ,(function(keyAlias) {
                    return function(data) {
                        console.log("inside closure",object[keyAlias],data);
                        //your logis goes here
                    }
                 })(key));
    }

小提琴:http://jsfiddle.net/eTdv5/1/(检查控制台日志)

解释整个事情并不像我猜的那样,你可以查看上面提到的SO帖子,如果有任何不清楚的地方请询问。

说明:

首先,key = 10

$.get("/echo/html?data=asdf" , <at this place key is 10> );

(function(key) {})(key) 就像调用display(key) 一样,认为您正在编写显示函数并使用参数key 调用它。

return function(data) {}; 将返回一个函数,实际上就像 (function(key) {})(key) 被这个返回的函数替换。

这将给你一个介绍,现在是如何管理范围的:

key 将随着for in 循环循环通过object 而改变其值,但我们创建的每个回调函数都有自己的keyAlias 与之关联,对应于当时key 的值回调函数是使用(function(key) {})(key)创建的

【讨论】:

  • 是的,该项目正在收到警报,除了值与原始警报不同
  • 你是否总是从内部函数中获取对象中的最后一个键。
  • 我想通了,由于 ajax 请求是异步处理的,所以对象仍然被 for 循环循环,所以当请求返回时,对象引用是不同的。
  • @CBaker 确切地说,您应该创建单独的持久范围以在每次循环运行中存储数据,
  • 你能详细说明一下吗,我对 jquery 和 javascript 还是很陌生
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-01
  • 2014-06-17
  • 2016-12-10
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多