1

重複の可能性:
Javascript 動的変数名

onClick イベントから JavaScript 関数に渡される変数があります。全部で 4 つの変数があります。2 つは方向を示し、2 つは速度の変化を示します。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;
    }
}

私の作業コードの2つのバージョンは次のとおりです。

バージョン 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

4 に答える 4

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 でその速度にアクセスします

于 2012-10-01T23:44:30.713 に答える
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']();
于 2012-10-01T23:34:36.040 に答える
1

次のように、2 つの変数を 1 つのオブジェクトに入れます。

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]
}
于 2012-10-01T23:35:57.997 に答える
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;
}

仕事をします。

于 2012-10-01T23:38:29.027 に答える