JavaScript - 如何创建变量名称

时间:2012-10-01 23:25:10

标签: javascript variables

  

可能重复:
  Javascript dynamic variable name

我将变量从onClick事件传递给JavaScript函数。总共有四个变量:两个表示方向,两个表示速度变化。我希望函数评估选择的方向(h_v_,水平和垂直),然后应用必要的速度(更快或更慢)。

现在,我通过首先评估方向并根据所选方向调用不同的changeSpeed函数来成功完成此操作。

我想要做的是组合这些功能。在示例中,$(direction + "speed")应该成为h_speedv_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;
    }
}

以下是我的工作代码的两个版本:

版本1

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;
    }
}

版本2

/**
 * 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;
    }
}

4 个答案:

答案 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;
}

会做的工作。