我将变量从onClick事件传递给JavaScript函数。总共有四个变量:两个表示方向,两个表示速度变化。我希望函数评估选择的方向(h_
或v_
,水平和垂直),然后应用必要的速度(更快或更慢)。
现在,我通过首先评估方向并根据所选方向调用不同的changeSpeed
函数来成功完成此操作。
我想要做的是组合这些功能。在示例中,$(direction + "speed")
应该成为h_speed
或v_speed
。
JavaScript是否配备了这样做? (真诚地,米格尔)
var h_speed = 10;
var v_speed = 10;
function changeSpeed(speed, direction){
var direction = direction;
switch (speed)
{
case 'slower':
$($direction + "speed") = $($direction + "speed")*2;
break;
case 'faster':
$($direction + "speed") = $($direction + "speed")/2;
break;
}
}
以下是我的工作代码的两个版本:
var h_speed = 10;
var v_speed = 10;
function identifyDirection(speed, direction){
switch (direction)
{
case 'vertical':
v_changeSpeed(speed);
break;
case 'horizontal':
h_changeSpeed(speed);
break;
}
}
function h_changeSpeed(speed){
switch (speed)
{
case 'slower':
h_speed = h_speed*2;
break;
case 'faster':
h_speed = h_speed/2;
break;
}
}
function v_changeSpeed(speed){
switch (speed)
{
case 'slower':
v_speed = v_speed*2;
break;
case 'faster':
v_speed = v_speed/2;
break;
}
}
/**
* the changeSpeed functions' arguments
* are placed directly in the function that
* determines whether horizontal or vertical
* speed is changing.
*
*/
function changeSpeed(speed, direction){
switch (direction)
{
case 'vertical':
switch (speed)
{
case 'slower':
v_speed = v_speed*2;
break;
case 'faster':
v_speed = v_speed/2;
break;
}
break;
case 'horizontal':
switch (speed)
{
case 'slower':
h_speed = h_speed*2;
break;
case 'faster':
h_speed = h_speed/2;
break;
}
break;
}
}
答案 0 :(得分:1)
变量是变量对象的属性。您可以按名称访问的唯一变量对象是全局变量对象(全局上下文中为this
或浏览器中为window
)。因此,对于全局变量,您可以这样做:
function hSpeed() {...}
function vSpeed(){...}
// Set direction
var direction = 'h';
// Call related function
window[direction + 'Speed']();
但是,你不能在函数执行上下文中这样做(因为ECMA-262明确地拒绝访问函数执行和变量对象),你需要使“变量”成为你访问它的对象的属性方式(即使用方括号表示法):
var lib = {};
var lib.hSpeed = function(){...};
var lib.vSpeed = function(){...};
// Set direction
var direction = 'h';
// Call related function
lib[direction + 'Speed']();
答案 1 :(得分:1)
将2个变量放在一个对象中,如:
var directions = {
horizontal: 1,
vertical: 1
}
然后你就可以从参数中取出方向并匹配对象的子节点:
function changeSpeed(speed, direction) {
//operate on diections[direction]
}
就改变速度而言,您可以对对象中的函数执行类似的操作,但在您的情况下,我建议使用其他数据结构,因为逻辑不会更改,只有参数:
var speedFactor = {
faster: 2,
slower: .5
}
然后你就可以做任何事情了:
function changeSpeed(speed, direction) {
directions[direction] = directions[direction] * speedFactor[speed]
}
答案 2 :(得分:1)
当然,有更好的方法可以实现您想要达到的目标,但是如果您想拥有相同的东西(请注意,您不应该使用全局变量,您可以使用函数范围将它们设为私有,但这是另一个主题)。
var speed = {
h: 10,
v: 10
};
function changeSpeed(speedChange, direction) {
switch (speedChange) {
case 'slower':
speed[direction] *= 2;
break;
case 'faster':
speed[direction] /= 2;
break;
}
}
现在您可以通过调用来更改速度,例如:
changeSpeed("slower", "h");
并通过speed.h或speed.v
访问该速度答案 3 :(得分:0)
好了...
整蛊但是:
//Global namespace
var speeds = {};
speeds['h_speed'] = 10;
speeds['v_speed'] = 10;
function changeSpeed(speed, direction){
var dir = direction.substring(0,1);
var sp = (speed === 'slower') ? 0.5 : 2;
//Still accessible from inside your function
speeds[dir + '_speed'] = speeds[dir + '_speed'] * sp;
}
会做的工作。