2012-10-01 5 views
1

가능한 복제를 만드는 방법 :
Javascript dynamic variable name자바 스크립트 - 변수 이름을

내가 변수가 자바 스크립트 함수에 onClick 이벤트에서 전달되는 있습니다. 총 4 개의 변수가 있습니다 : 두 개는 방향을 나타내고 두 개는 속도 변화를 나타냅니다. 나는 어떤 방향이 선택되었는지 (가로와 세로에 대해 h_ 또는 v_) 평가 한 다음 필요한 속도를 (더 빠르거나 느리게) 적용하려고합니다.

지금 바로 방향을 평가하고 선택한 방향에 따라 다른 changeSpeed 함수를 호출하여 성공적으로 수행합니다.

내가 뭘하고 싶은지는 이러한 기능을 결합하는 것입니다. 이 예에서 $(direction + "speed")h_speed 또는 v_speed이됩니다.

자바 스크립트가 장착되어 있습니까? (진심으로, 미겔)

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

VERSION 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; 
    } 
} 
+0

'경우 (방향 == '수직') { v_speed * = 속도 == '느림'? 2 : 0.5; } else { h_speed * = speed == 'slower'? 2 : 0.5; }' – zerkms

+0

모두 감사합니다! 이 모든 답장은 훌륭합니다. zerkms, 너는 내가 지금까지 시도한 유일한 코드이며 작동한다. –

답변

1

변수 만들어진 특성 변수 객체. 이름으로 액세스 할 수있는 유일한 변수 객체는 전역 변수 객체 (전역 컨텍스트에서는 this이거나 브라우저에서는 window)입니다. 그래서 전역 변수에 대한 당신이 할 수 있습니다 : (ECMA-262가 명시 적으로 기능 실행 및 변수 개체에 대한 액세스를 거부하기 때문에)

function hSpeed() {...} 

function vSpeed(){...} 

// Set direction 
var direction = 'h'; 

// Call related function 
window[direction + 'Speed'](); 

을하지만, 당신은, 당신의 "를 만들 필요가 함수 실행 컨텍스트에 할 수 없어 (즉, 대괄호 표기법을 사용) 변수 "같은 방식으로 접근 객체의 속성 : 그럼

var directions = { 
    horizontal: 1, 
    vertical: 1 
} 

:

var lib = {}; 
var lib.hSpeed = function(){...}; 
var lib.vSpeed = function(){...}; 

// Set direction 
var direction = 'h'; 

// Call related function 
lib[direction + 'Speed'](); 
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] 
} 
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; 
} 

이 일을 할 것입니다.

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에 의해 그 속도에 액세스