2010-03-28 28 views
1

我正在写一个Javascript函数,它可以处理一个即时写入并作为参数发送的数组。Javascript函数编程 - 接收精心设计的参数

function returnJourney(animation,clean){ 
    var properties = {}; 
    // loads of other inane stuff 
    for(i in animation[0]) properties[animation[0][i]] = animation[0].i; 
    // heaps more inane stuff 
} 

在考虑中的动画是一组用于一个jQuery动画参数:

该函数如下写入。通常采用格式({key:value,key:value},speedAsInteger,modifierAsString)

因此揭开序幕初始调试我把它用:

returnJouney(({'foo':'bar'},3000),1);

直蝙蝠事情路要走。据我所知,这将有returnJourney确认clean === 1animation是一个数组,其中第一个孩子的对象和第二个数字3000。

Firebug告诉我animation求值为3000.我在做什么错了?

回答

1
properties[animation[0][i]] = animation[0].i; 

应该

properties[animation[0][i]] = animation[0][i]; 

.i字面上叫'i'财产。由于(可能)不存在,您将为每个属性分配undefined

returnJouney(({'foo':'bar'},3000),1); 

也变得毫无意义 - 你的意思是一个数组?:

returnJourney([{'foo':'bar'},3000],1); 

此外,使用var i in而不是((有在JavaScript中没有 '元组' 类型。)错字)in in。忘记var为您提供了一个意外的全球性问题,可能会带来烦人的调试副作用。

+0

感谢鲍勃,只需要一个数组语法刷新:) – Barney 2010-03-28 14:47:15

0

它将({'foo':'bar'},3000)作为使用逗号运算符的表达式处理,该运算符返回右操作数作为其结果。也许你的意思是[{'foo':'bar'},3000]

1

JavaScript中没有元组类型。您所拥有的只是对象{}或数组[]。他们都可以理解任何类型的混合。所以你可以将你的动画参数作为数组([{'foo':'bar'},3000])传递,看起来像你想要的。 或者,因为它通常在JavaScript中完成的,使用对象,而不是:

returnJourney({props: {foo: "bar"}, speed: 3000}, 1); 

function returnJourney(animation, clean) { 
    var props = animation.props; 
    var speed = animation.speed; 
} 

注意对象符号让你忽略你不希望传递的东西,使得它非常清楚什么样的价值是什么意思。

至于为什么您的animation解决为3000,这是非常简单的,这是如何,运营商的工作原理。它返回大括号中的最后一项。所以(10, 20, 30)将评估为30,所以将(f(1000), "hello", 30)。只有最后一个值才重要,其他人只是忽略了(但是无论如何,所以任何副作用都会在那里)。