jquery传递函数外的变量值

时间:2012-12-04 02:00:12

标签: jquery variables global each

我有一个难以想象的巨大订单,我正在梳理价值并从中构建数组。除此之外,我还需要一些each()次迭代来提取值,然后将它们附加到之后使用的变量中。问题是值是返回undefined,我认为这是因为它们是在循环中分配的。

这是我的逻辑:

  • 声明变量
  • 遍历每个
    • 为变量
    • 赋值
  • 发布到数组

我的理解是函数外部的变量声明允许我全局使用它。猜猜我错了!

这是一个jsFiddle:http://jsfiddle.net/x7CL6/

以下是代码:

$('a').click(function(event){

    event.preventDefault();   

/* Declare Variables */

    var test = [],
        one,
        two,
        three,
        four,
        el,
        kind,
        val;

/* Loop through each paragraph */

    $('section').find('p').each(function(){

        el   = $(this);
        kind = el.attr('class');
        val  = el.html();

        if (val === '1'){

            one = val;
        } else if (val === '2'){

            two = val;
        } else if (val === '3'){

            three = val;
        } else if (val === '4'){

            four = val;    
        }
    });

    test.push({
        one: one,
        two: two,
        three: three,
        four: four
    });

    console.log(test);
});
​

1 个答案:

答案 0 :(得分:0)

  

“我的理解是函数外部的变量声明允许我全局使用它。”

如果变量的声明在任何函数之外,则该变量是全局变量。在您的情况下,所有变量都在点击处理函数中定义,因此所有变量都可以在其中访问,任何嵌套函数都包括each()回调。

如果意图是每次点击都应该向test数组添加另一个对象,那么您需要在点击处理程序之外定义test

您的变量未定义的原因是因为您的if / else条件始终为false,因此永远不会为变量赋值。您的val变量会从循环的当前元素中分配html内容,并且html内容永远不会等于"1""2"等字符串,您将其与

我认为您可能希望将每个元素的类属性进行比较,而不是将其放在kind变量中:

if (kind === "1")

依此类推:http://jsfiddle.net/x7CL6/4/

...但鉴于您似乎正按文档顺序处理元素,您可以利用jQuery将.each()回调传递给当前元素的索引这一事实:

$('section').find('p').each(function(i){ // add i param
    // inside the loop test i (note it starts with 0)
    // instead of testing val or kind

演示:http://jsfiddle.net/x7CL6/2/

然而,仍然会留下一个丑陋的if / else if / ...结构,你可以避免这样:

var test = [],
    propNames = ["one","two","three","four"],
    obj = {};

$('section').find('p').each(function(i){
    obj[ propNames[i] ] = $(this).html();
});

test.push(obj);

演示:http://jsfiddle.net/x7CL6/5/