【问题标题】:variable scope in a getJson grepgetJson grep 中的变量范围
【发布时间】:2011-09-20 16:24:16
【问题描述】:

我试图在 getJson 请求的 grep 中使用变量。我希望根据用户的选择(他们单击的链接)来定义变量——但我不确定如何将它传递给 grep,因为似乎必须在 getJson 调用中定义变量?

第一个例子有效:

$.getJSON('data/all.json', function(data)
  {
    location = $.grep(data, function(el, i)
     {
       var search=el.clicked_field;
       return search === "Y"
      });
     });

这第二个没有:

var search=el.clicked_field;
$.getJSON('data/all.json', function(data)
  {
    location = $.grep(data, function(el, i)
     {
       return search === "Y"
      });
     });

我认为这个问题是在 jQuery 论坛中讨论过的: http://forum.jquery.com/topic/variable-scoping-and-the-getjson-method

但我无法复制建议的解决方案。任何帮助都会很棒......

【问题讨论】:

    标签: jquery scope getjson


    【解决方案1】:

    两段代码唯一明显的区别是var search=el.clicked_field 脱离$.grep 的上下文移动到整个代码体之前。那时,el 还不存在。因此,除非您有其他代码可以涵盖您的帖子中缺少的内容,否则这就是您的问题。

    编辑:

    JavaScript 小技巧。变量在其范围内是全局的,因此例如:

    $('#some-element').click(function() {
        var someElement = $(this);
    
        $.getJSON('url', function(data, jqXHR){
            console.log(someElement); // exists!
        });
    });
    

    编辑:(再次)

    好的,所以您的逻辑和语法存在一些基本问题。在 cmets 中一次处理这一方面变得有点乏味,所以我只是举例说明:

    $('#some-element').click(function() {
        var someElement = $(this).attr('href'); 
    
        // someElement == 'http://google.com'
    
        $.getJSON('data/all.json', function(data) {
           location = $.grep(data, function(el, i) {
               clicked = someElement.toLowerCase().slice(1);
    
               // clicked == 'ttp://google.com'   # Why?
    
               link = 'el' + '.' + clicked;
    
               // link == 'el.ttp://google.com'   # Why?
    
               console.log(link);  // This bit was for illustrative purposes, you should remove it from your code now.
               return link === "Y";
    
               // "el.ttp://google.com" != "Y"   # Obviously, and never will
           });
        });
    

    data 是 JavaScript 对象的列表。将其传递给$.grep 将导致它遍历这些对象。每次迭代,当前对象将存储在el 中,并且该对象在data 数组中的索引将存储在i 中。以这段 JSON 为例:

    [ { "foo": 1, "bar": 2 } ]
    

    如果这是返回的 JSON,那么 el 将具有 foobar 的属性,然后您可以使用它们来访问每个属性的值,例如:

    el.foo == 1 // True
    el.bar == 2 // True
    

    如果您真的发布了您的 JSON 响应,也许我可以为您提供进一步的帮助。 (更新您的问题,不要将其作为评论发布)

    【讨论】:

    • 好的,是的 - 我回应了另一个指出这一点的回应。我也尝试过像这样在 getjson 之外构造变量——var search='el.' + clicked_field;但这也没有用。
    • 是的,不会。你为什么一开始就想在外面做呢?
    • 因此 grep 中使用的术语是根据用户点击的内容动态定义的
    • 谢谢... :} 你知道我将如何访问 el.someElement 吗?我已经尝试将它嵌套在示例函数中,但它似乎没有获取值 - $('#some-element').click(function() { var someElement = $(this); $.getJSON(' url', function(data, jqXHR) {console.log(someElement) function(data) { location = $.grep(data, function(el, i) { return el.someElement === "Y" }); / /其余函数 //
    • 在这种情况下,someElement 不是el 的属性。它独立存在。这个想法是您将用户单击的元素保存到一个变量中,然后在该范围内成为全局变量。然后,您在范围内执行的任何操作都可以访问该变量,从而访问用户单击的元素。
    【解决方案2】:

    您在第二个 grep 的回调中定义 el,这就是它在该范围之外未定义的原因。

    【讨论】:

    • 我也尝试过像这样创建变量 -- var search= 'el.' + clicked_field;但这也没有用...?
    猜你喜欢
    • 1970-01-01
    • 2012-03-30
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    相关资源
    最近更新 更多